251029
This commit is contained in:
209
FATrace.App/UniCodeToZPL/UnicodeToZPLHelper.cs
Normal file
209
FATrace.App/UniCodeToZPL/UnicodeToZPLHelper.cs
Normal file
@@ -0,0 +1,209 @@
|
||||
using System.Drawing.Imaging;
|
||||
using System.Text;
|
||||
|
||||
namespace FATrace.App.UniCodeToZPL
|
||||
{
|
||||
/// <summary>
|
||||
/// Unicode字符转化成对应的ZPL指令
|
||||
/// </summary>
|
||||
public class UnicodeToZPLHelper
|
||||
{
|
||||
/// <summary>
|
||||
/// 生成图片回调显示
|
||||
/// </summary>
|
||||
public static event Action<Image> OnViewImageCallBack;
|
||||
/// <summary>
|
||||
/// 未压缩算法处理
|
||||
/// Unicode字符转化成对应的ZPL指令
|
||||
/// </summary>
|
||||
/// <param name="content">文本内容</param>
|
||||
/// <param name="name">生成的图片名称,名称需要唯一</param>
|
||||
/// <param name="font">字体</param>
|
||||
/// <param name="textDirection">文字方向</param>
|
||||
/// <returns>
|
||||
/// 返回转换完未压缩的ZPL指令
|
||||
/// </returns>
|
||||
public static string UnCompressZPL(string content, string name, Font font, TextDirection textDirection)
|
||||
{
|
||||
Bitmap img = TextToBitmap(content, font, textDirection);
|
||||
if (textDirection != TextDirection.Degree0)
|
||||
{
|
||||
img = Rotate(img, (int)textDirection);
|
||||
}
|
||||
if (OnViewImageCallBack != null)
|
||||
{
|
||||
OnViewImageCallBack(img);
|
||||
}
|
||||
string imgCode = ConvertToZebraGRF(img);
|
||||
var totalBytes = ((img.Size.Width / 8 + ((img.Size.Width % 8 == 0) ? 0 : 1)) * img.Size.Height).ToString(); //图形中的总字节数
|
||||
var lineBytes = (img.Size.Width / 8 + ((img.Size.Width % 8 == 0) ? 0 : 1)).ToString(); //每行的字节数
|
||||
return string.Format("~DG{0}.GRF,{1},{2},{3}^XG{0}", name, totalBytes, lineBytes, imgCode);
|
||||
}
|
||||
/// <summary>
|
||||
/// 未压缩算法处理
|
||||
/// Unicode字符转化成对应的ZPL指令
|
||||
/// </summary>
|
||||
/// <param name="content">文本内容</param>
|
||||
/// <param name="name">生成的图片名称,名称需要唯一</param>
|
||||
/// <param name="textDirection">文字方向</param>
|
||||
/// <returns>
|
||||
/// 返回转换完未压缩的ZPL指令
|
||||
/// </returns>
|
||||
public static string UnCompressZPL(Bitmap img, string name, TextDirection textDirection)
|
||||
{
|
||||
if (textDirection != TextDirection.Degree0)
|
||||
{
|
||||
img = Rotate(img, (int)textDirection);
|
||||
}
|
||||
if (OnViewImageCallBack != null)
|
||||
{
|
||||
OnViewImageCallBack(img);
|
||||
}
|
||||
string imgCode = ConvertToZebraGRF(img);
|
||||
var totalBytes = ((img.Size.Width / 8 + ((img.Size.Width % 8 == 0) ? 0 : 1)) * img.Size.Height).ToString(); //图形中的总字节数
|
||||
var lineBytes = (img.Size.Width / 8 + ((img.Size.Width % 8 == 0) ? 0 : 1)).ToString(); //每行的字节数
|
||||
return string.Format("~DG{0}.GRF,{1},{2},{3}^XG{0}", name, totalBytes, lineBytes, imgCode);
|
||||
}
|
||||
/// <summary>
|
||||
/// 压缩算法处理
|
||||
/// Unicode字符转化成对应的ZPL指令
|
||||
/// </summary>
|
||||
/// <param name="content">文本内容</param>
|
||||
/// <param name="name">生成的图片名称,名称需要唯一</param>
|
||||
/// <param name="font">字体</param>
|
||||
/// <param name="textDirection">文字方向</param>
|
||||
/// <returns>
|
||||
/// 返回转换完压缩的ZPL指令
|
||||
/// </returns>
|
||||
public static string CompressZPL(string content, string name, Font font, TextDirection textDirection)
|
||||
{
|
||||
Bitmap img = TextToBitmap(content, font, textDirection);
|
||||
if (textDirection != TextDirection.Degree0)
|
||||
{
|
||||
img = Rotate(img, (int)textDirection);
|
||||
}
|
||||
if (OnViewImageCallBack != null)
|
||||
{
|
||||
OnViewImageCallBack(img);
|
||||
}
|
||||
string imgCode = ConvertToZebraGRF(img);
|
||||
imgCode = ZebraCompress.ZebraCompressCode(imgCode);
|
||||
var totalBytes = ((img.Size.Width / 8 + ((img.Size.Width % 8 == 0) ? 0 : 1)) * img.Size.Height).ToString(); //图形中的总字节数
|
||||
var lineBytes = (img.Size.Width / 8 + ((img.Size.Width % 8 == 0) ? 0 : 1)).ToString(); //每行的字节数
|
||||
return string.Format("~DG{0}.GRF,{1},{2},{3}^XG{0}", name, totalBytes, lineBytes, imgCode);
|
||||
}
|
||||
/// <summary>
|
||||
/// 把文字转换才Bitmap
|
||||
/// </summary>
|
||||
/// <param name="text"></param>
|
||||
/// <param name="font"></param>
|
||||
/// <returns></returns>
|
||||
private static Bitmap TextToBitmap(string text, Font font, TextDirection textDirection)
|
||||
{
|
||||
StringFormat format = new StringFormat(StringFormatFlags.NoClip);
|
||||
Bitmap bitmap = new Bitmap(1, 1);
|
||||
Graphics graphics = Graphics.FromImage(bitmap);
|
||||
SizeF sizef = graphics.MeasureString(text, font, PointF.Empty, format);
|
||||
int width = (int)(sizef.Width + 1);
|
||||
int height = (int)(sizef.Height + 1);
|
||||
Rectangle rect = new Rectangle(0, 0, width, height);
|
||||
bitmap.Dispose();
|
||||
bitmap = new Bitmap(width, height);
|
||||
graphics = Graphics.FromImage(bitmap);
|
||||
graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;//使用ClearType字体功能
|
||||
graphics.FillRectangle(new SolidBrush(Color.White), rect);
|
||||
graphics.DrawString(text, font, Brushes.Black, rect, format);
|
||||
return bitmap;
|
||||
}
|
||||
/// <summary>
|
||||
/// 以逆时针为方向对图像进行旋转
|
||||
/// </summary>
|
||||
/// <param name="b">位图流</param>
|
||||
/// <param name="angle">旋转角度[0,360](前台给的)</param>
|
||||
/// <returns></returns>
|
||||
private static Bitmap Rotate(Bitmap b, int angle)
|
||||
{
|
||||
angle = angle % 360;
|
||||
//弧度转换
|
||||
double radian = angle * Math.PI / 180.0;
|
||||
double cos = Math.Cos(radian);
|
||||
double sin = Math.Sin(radian);
|
||||
//原图的宽和高
|
||||
int w = b.Width;
|
||||
int h = b.Height;
|
||||
int W = (int)(Math.Max(Math.Abs(w * cos - h * sin), Math.Abs(w * cos + h * sin)));
|
||||
int H = (int)(Math.Max(Math.Abs(w * sin - h * cos), Math.Abs(w * sin + h * cos)));
|
||||
//目标位图
|
||||
Bitmap dsImage = new Bitmap(W, H);
|
||||
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(dsImage);
|
||||
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;
|
||||
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
|
||||
//计算偏移量
|
||||
Point Offset = new Point((W - w) / 2, (H - h) / 2);
|
||||
//构造图像显示区域:让图像的中心与窗口的中心点一致
|
||||
Rectangle rect = new Rectangle(Offset.X, Offset.Y, w, h);
|
||||
Point center = new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2);
|
||||
g.TranslateTransform(center.X, center.Y);
|
||||
g.RotateTransform(360 - angle);
|
||||
//恢复图像在水平和垂直方向的平移
|
||||
g.TranslateTransform(-center.X, -center.Y);
|
||||
g.DrawImage(b, rect);
|
||||
//重至绘图的所有变换
|
||||
g.ResetTransform();
|
||||
g.Save();
|
||||
g.Dispose();
|
||||
return dsImage;
|
||||
}
|
||||
/// <summary>
|
||||
/// 将BitMap图片转化成对应的灰度图片
|
||||
/// 取灰度分界中间值,作为黑白像素点的判断,187数值比较合适
|
||||
/// </summary>
|
||||
/// <param name="bitMap"></param>
|
||||
/// <returns></returns>
|
||||
private static unsafe string ConvertToZebraGRF(Bitmap bitMap)
|
||||
{
|
||||
System.Text.StringBuilder builder = new StringBuilder();
|
||||
BitmapData data = bitMap.LockBits(new Rectangle(0, 0, bitMap.Width, bitMap.Height), ImageLockMode.ReadOnly,
|
||||
PixelFormat.Format24bppRgb);
|
||||
|
||||
var bp = (byte*)data.Scan0.ToPointer();
|
||||
for (int i = 0; i < data.Height; i++)
|
||||
{
|
||||
int count = 0;
|
||||
int tempData = 0;
|
||||
for (int j = 0; j < data.Width; j++)
|
||||
{
|
||||
float gray = 0.11F * bp[i * data.Stride + j * 3] + 0.59F * bp[i * data.Stride + j * 3 + 1] +
|
||||
0.3F * bp[i * data.Stride + j * 3 + 2];
|
||||
tempData = tempData * 2;
|
||||
if (gray < 187)
|
||||
{
|
||||
tempData++;
|
||||
}
|
||||
count++;
|
||||
if (j == (data.Width - 1))
|
||||
{
|
||||
if (count < 8)
|
||||
{
|
||||
tempData = tempData * (2 ^ (8 - (int)count));
|
||||
string temp = tempData.ToString("X").PadLeft(2, '0');
|
||||
builder.Append(temp);
|
||||
tempData = 0;
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
if (count >= 8)
|
||||
{
|
||||
string temp = tempData.ToString("X").PadLeft(2, '0');
|
||||
builder.Append(temp);
|
||||
tempData = 0;
|
||||
count = 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
bitMap.UnlockBits(data);
|
||||
return builder.ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user