提高ESC/POS Thermal_Printer图像打印速度的方法?
Ways to improve ESC/POS Thermal_Printer image printing speed?
我在便携式热敏打印机上使用 热敏打印机图像打印 进行打印工作已经好几个星期了,这是我获得的图像打印代码。
public static byte[] GetByteImage(Bitmap bm, int BitmapWidth)
{
BitmapData data = GetGreyScaledBitmapData(bm, BitmapWidth);
BitArray dots = data.Dots;
string t = data.Width.ToString();
byte[] width = BitConverter.GetBytes(data.Width);
int offset = 0;
MemoryStream stream = new MemoryStream();
BinaryWriter bw = new BinaryWriter(stream);
//Line spacing
bw.Write((char)0x1B);
bw.Write('3');
bw.Write((byte)0);
while (offset < data.Height)
{
//Declare printer to print image mode
bw.Write((char)0x1B);
bw.Write('*');
bw.Write((byte)33);
bw.Write(width[0]);
bw.Write(width[1]);
for (int x = 0; x < data.Width; ++x)
{
for (int k = 0; k < 3; ++k)
{
byte slice = 0;
for (int b = 0; b < 8; ++b)
{
int y = (((offset / 8) + k) * 8) + b;
int i = (y * data.Width) + x;
bool v = false;
if (i < dots.Length)
{
v = dots[i];
}
slice |= (byte)((v ? 1 : 0) << (7 - b));
}
bw.Write(slice);
}
}
offset += 24;
bw.Write((char)0x0A);
}
bw.Write((char)0x1B);
bw.Write('3');
bw.Write((byte)0);
bw.Flush();
byte[] bytes = stream.ToArray();
return bytes;
}
public static BitmapData GetGreyScaledBitmapData(Bitmap bmpFileName, double imgsize)
{
using (var bitmap = (Bitmap)(bmpFileName))
{
var threshold = 127;
var index = 0;
double multiplier = imgsize;
double scale = (double)(multiplier / (double)bitmap.Width);
int xheight = (int)(bitmap.Height * scale);
int xwidth = (int)(bitmap.Width * scale);
var dimensions = xwidth * xheight;
var dots = new BitArray(dimensions);
for (var y = 0; y < xheight; y++)
{
for (var x = 0; x < xwidth; x++)
{
var _x = (int)(x / scale);
var _y = (int)(y / scale);
Android.Graphics.Color color = new Android.Graphics.Color(bitmap.GetPixel(_x, _y));
var luminance = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);
dots[index] = (luminance < threshold);
index++;
}
}
return new BitmapData()
{
Dots = dots,
Height = (int)(bitmap.Height * scale),
Width = (int)(bitmap.Width * scale)
};
}
}
public class BitmapData
{
public BitArray Dots
{
get;
set;
}
public int Height
{
get;
set;
}
public int Width
{
get;
set;
}
}
问题是,它打印速度很慢并且打印时发出急促的声音。
另一个问题是,图像转换为灰度的方法有点慢。
当我测试其他应用程序时,我发现它们没有抖动的声音,并且在单击打印按钮后几乎立即打印图像。
有没有办法改进上面的代码,使其能够顺利打印?
这是我测试过的应用 Printer Lab - 热敏打印机管理器
我用的热敏打印机RPP300 72mm Mobile Printer
您使用的 ESC * 命令每 24 个点高度打印一次。
然后,当您感觉到问题时,它会出现卡顿和缓慢的打印。
请结合使用 GS * 和 GS / 命令进行改进。
热敏移动打印机命令集手册的第 24 至 26 页描述了其规格的详细信息。
另外:
顺便说一句,我忽略了另一个命令。
我们可以更轻松地创建要发送的数据。
然而,流畅的打印取决于打印机性能和通信线路速度。
该命令是 GS v 0。它在手册的第 32 和 33 页上有描述。
本文程序为FS q和GS(L/GS 8 L指令,但也可用于GS *指令的位图数据转换过程,请试一试。
终于找到解决办法了。我当时真的很傻。向您的打印机制造商公司索要 SDK 或从其他打印机制造商处寻找 SDK。
我在便携式热敏打印机上使用 热敏打印机图像打印 进行打印工作已经好几个星期了,这是我获得的图像打印代码。
public static byte[] GetByteImage(Bitmap bm, int BitmapWidth)
{
BitmapData data = GetGreyScaledBitmapData(bm, BitmapWidth);
BitArray dots = data.Dots;
string t = data.Width.ToString();
byte[] width = BitConverter.GetBytes(data.Width);
int offset = 0;
MemoryStream stream = new MemoryStream();
BinaryWriter bw = new BinaryWriter(stream);
//Line spacing
bw.Write((char)0x1B);
bw.Write('3');
bw.Write((byte)0);
while (offset < data.Height)
{
//Declare printer to print image mode
bw.Write((char)0x1B);
bw.Write('*');
bw.Write((byte)33);
bw.Write(width[0]);
bw.Write(width[1]);
for (int x = 0; x < data.Width; ++x)
{
for (int k = 0; k < 3; ++k)
{
byte slice = 0;
for (int b = 0; b < 8; ++b)
{
int y = (((offset / 8) + k) * 8) + b;
int i = (y * data.Width) + x;
bool v = false;
if (i < dots.Length)
{
v = dots[i];
}
slice |= (byte)((v ? 1 : 0) << (7 - b));
}
bw.Write(slice);
}
}
offset += 24;
bw.Write((char)0x0A);
}
bw.Write((char)0x1B);
bw.Write('3');
bw.Write((byte)0);
bw.Flush();
byte[] bytes = stream.ToArray();
return bytes;
}
public static BitmapData GetGreyScaledBitmapData(Bitmap bmpFileName, double imgsize)
{
using (var bitmap = (Bitmap)(bmpFileName))
{
var threshold = 127;
var index = 0;
double multiplier = imgsize;
double scale = (double)(multiplier / (double)bitmap.Width);
int xheight = (int)(bitmap.Height * scale);
int xwidth = (int)(bitmap.Width * scale);
var dimensions = xwidth * xheight;
var dots = new BitArray(dimensions);
for (var y = 0; y < xheight; y++)
{
for (var x = 0; x < xwidth; x++)
{
var _x = (int)(x / scale);
var _y = (int)(y / scale);
Android.Graphics.Color color = new Android.Graphics.Color(bitmap.GetPixel(_x, _y));
var luminance = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);
dots[index] = (luminance < threshold);
index++;
}
}
return new BitmapData()
{
Dots = dots,
Height = (int)(bitmap.Height * scale),
Width = (int)(bitmap.Width * scale)
};
}
}
public class BitmapData
{
public BitArray Dots
{
get;
set;
}
public int Height
{
get;
set;
}
public int Width
{
get;
set;
}
}
问题是,它打印速度很慢并且打印时发出急促的声音。 另一个问题是,图像转换为灰度的方法有点慢。
当我测试其他应用程序时,我发现它们没有抖动的声音,并且在单击打印按钮后几乎立即打印图像。
有没有办法改进上面的代码,使其能够顺利打印?
这是我测试过的应用 Printer Lab - 热敏打印机管理器
我用的热敏打印机RPP300 72mm Mobile Printer
您使用的 ESC * 命令每 24 个点高度打印一次。
然后,当您感觉到问题时,它会出现卡顿和缓慢的打印。
请结合使用 GS * 和 GS / 命令进行改进。
热敏移动打印机命令集手册的第 24 至 26 页描述了其规格的详细信息。
另外:
顺便说一句,我忽略了另一个命令。
我们可以更轻松地创建要发送的数据。
然而,流畅的打印取决于打印机性能和通信线路速度。
该命令是 GS v 0。它在手册的第 32 和 33 页上有描述。
本文程序为FS q和GS(L/GS 8 L指令,但也可用于GS *指令的位图数据转换过程,请试一试。
终于找到解决办法了。我当时真的很傻。向您的打印机制造商公司索要 SDK 或从其他打印机制造商处寻找 SDK。