Files
FATrace/FATrace.App/UniCodeToZPL/UnicodeToZPLHelper.cs
2025-10-29 11:42:58 +08:00

210 lines
9.3 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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();
}
}
}