This commit is contained in:
2025-10-29 11:42:58 +08:00
parent 7f6f84cd0e
commit a178c3550e
190 changed files with 81361 additions and 92 deletions

View 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();
}
}
}