using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using System.Collections.Generic; using System.Text; namespace JingGong.Abp.Print.GoDEX { /// /// 打印图片 /// public abstract class GoDEXPrintImage : GoDEXPrintData { /// /// X起始位置,单位mm /// public int PosX { get; set; } /// /// Y起始位置,单位mm /// public int PosY { get; set; } /// /// 图片宽,单位mm /// public int Width { get; set; } /// /// 图片高,单位mm /// public int Height { get; set; } /// /// 打印图像 /// /// public override bool Print() { var imageData = ProcessImageData(); //Q10,10,102,484(圖案命令x,y,width,heigh) //x = 自左上角量起之水平位置(單位:dots). //y = 自左上角量起之垂直位置(單位:dots). //width = 圖檔寬度(單位:byte) //height = 圖檔高度(單位:dots) EzioInterop.sendcommand($"Q{PosX * Dots},{PosY * Dots},{imageData.Width},{imageData.Height}"); //EzioInterop.sendcommand($"Q40,10,3,8"); //发送图片数据 //EzioInterop.sendcommand(imageData); EzioInterop.sendbuf(imageData.Data, imageData.Data.Length); //EzioInterop.sendbuf(new byte[] { 0b01000001, 0b01000001, 0b01000001, //0b01000001,0b01000001,0b01000001, //0b01000001,0b01000001,0b01000001, //0b01000001,0b01000001,0b01000001, //0b01000001,0b01000001,0b01000001, //0b01000001,0b01000001,0b01000001, //0b01000001,0b01000001,0b01000001, //0b01000001,0b01000001,0b01000001,}, 24); EzioInterop.sendcommand("\n"); return true; } /// /// 处理图片数据 /// /// /// protected virtual (int Width, int Height, byte[] Data) ProcessImageData() { var imageBytes = GetImageData(); // 加载图像 using (var image = Image.Load(imageBytes)) { // 获取原始图像尺寸 int originalWidth = image.Width; int originalHeight = image.Height; image.Mutate(ctx => { // 转换为灰度图像 // 进行二值化,128是阈值,低于该值为黑色,高于为白色 //image.Mutate(x => x.Grayscale().BinaryThreshold(128f / 255f)); ctx.Grayscale(); //调整图像大小 if (Width != 0 || Height != 0) ctx.Resize(originalWidth * 2, originalHeight * 2, KnownResamplers.Bicubic); ////适当锐化 //ctx.GaussianSharpen(3f); ////调整对比度 //ctx.Contrast(1.2f); }); return ConvertImageToBytes(image); } } /// /// 获取图片数据 /// /// protected abstract byte[] GetImageData(); /// /// 获取图像数据 /// /// /// protected (int Width, int Height, byte[] Data) ConvertImageToBytes(Image image) { StringBuilder sb = new StringBuilder(); var clonedImage = image.CloneAs(); // 创建一个列表来存储字节数据 List byteList = new List(); // 遍历每一行 for (int y = 0; y < image.Height; y++) { byte currentByte = 0; int bitCount = 0; for (int x = 0; x < image.Width; x++) { // 获取当前像素的颜色 var pixel = clonedImage[x, y]; // 黑色为1,白色为0(颠倒值) //将灰度转为黑白,选择适当灰度值转为黑色 byte pixelValue = pixel.R <= 180 ? (byte)1 : (byte)0; // 将像素值存入当前字节 currentByte |= (byte)(pixelValue << (7 - bitCount)); bitCount++; // 如果一个字节已满,保存该字节并清空 if (bitCount == 8) { sb.Append((char)currentByte); byteList.Add(currentByte); currentByte = 0; bitCount = 0; } } // 如果行末不足8个像素,则补充零 if (bitCount > 0) { sb.Append((char)currentByte); byteList.Add(currentByte); } } return (image.Width % 8 == 0 ? image.Width / 8 : image.Width / 8 + 1, image.Height, byteList.ToArray()); } } }