C# 热敏打印机如何通过ESC/P指令打印图片?

xiang96 2011-08-11 05:28:49
2.2.5图形打印命令
ESC * 设定点图命令
格式: ASCII :ESC * m n1 n2 [d]k
十进制 :27 42 m n1 n2 [d]k
十六进制 :1B 2A m n1 n2 [d]k
说明:
设定点图方式(用m),点数(用n1,n2)以及点图内容(用[d]k)。
m =0,1,32,33。n1=0~255,n2=0~3。d=0~255.
k=n1+256╳n2 (m=0,1)
k=(n1+256╳n2) ╳3 (m=32,33)
◆水平方向点数为n1+256╳n2
◆如果点数超过一行,超过其最大点数(与选择的点图方式有关,详
见下表)的部分被忽略。
◆d为点图数据字节,相应位为1则表示该点打印,相应位为0,则表示
该点不打印。(k表示数据个数)
◆m用于选择点图方式。
M Mode 纵向 横向
点数 点密度 点密度 最多点数
0 8点单密度 8 68DPI 101DPI 288
1 8点双密度 8 68DPI 203DPI 576
32 24点单密度 24 203DPI 101DPI 288
33 24点双密度 24 203DPI 203DPI 576
8点方式 24点方式

这个是开发文档
...全文
1076 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
kzccomputer 2011-12-08
  • 打赏
  • 举报
回复
skylkj 你好:

我在epson打印机测试了一下数据不对,是乱的黑点,不是图片啊
skylkj 2011-08-12
  • 打赏
  • 举报
回复
上面程序是3英寸打印机的,横向一行576个点,如果是两英寸的,自己改成384

还有,我这里要求的图像是黑白图,不能是灰度图,因为我是判断颜色的
if (btm.GetPixel(coli, dotrow).ToArgb() == Color.Black.ToArgb())

你可以自己先对图像进行二值化
skylkj 2011-08-12
  • 打赏
  • 举报
回复
无非就是把数据组织起来丢给串口

以前刚好做过,不过应该不是同一家的打印机,代码仅供参考


if (pictureBox1.Image == null)
{
MessageBox.Show("请先读取图象!");
return;
}

if ((!checkBox1.Checked) && (!serialPort1.IsOpen))
{
MessageBox.Show("请先打开端口!");
return;
}

Bitmap btm = new Bitmap(pictureBox1.Image);

int height, width, row, col;
height = btm.Height;
width = btm.Width;
row = (height + 23) / 24; //字符行
col = (width > 576) ? 576 : width;

//根据图象大小计算数据量
int PicDataLen = 3 * col;
int DataLen = 5 + PicDataLen + 2; //5字节命令头 + 图象数据 + 2字节回车符立即打印
byte[] aCmdBuf = new byte[DataLen];

aCmdBuf[0] = 27;
aCmdBuf[1] = 42;
aCmdBuf[2] = 33;
aCmdBuf[3] = (byte)(col % 256);
aCmdBuf[4] = (byte)(col / 256);

aCmdBuf[DataLen - 2] = 0x0d;
aCmdBuf[DataLen - 1] = 0x0a;

string SaveText = "";

for (int rowi = 0; rowi < row; rowi++)
{

int DataOffset = 5;

for (int coli = 0; coli < col; coli++)
{
for (int i = 0; i < 3; i++)
{
byte temp = 0;

for (int j = 0; j < 8; j++)
{
int dotrow = rowi * 24 + i * 8 + j;

try
{
if (btm.GetPixel(coli, dotrow).ToArgb() == Color.Black.ToArgb())
temp += (byte)(Math.Pow(2, (7 - j)));
}
catch
{
continue;
}
}

aCmdBuf[DataOffset++]=temp;
}
}

if (!checkBox1.Checked)
serialPort1.Write(aCmdBuf, 0, aCmdBuf.Length);
else
{
for (int i = 0; i < aCmdBuf.Length; i++)
SaveText += ("0x"+Convert.ToString(aCmdBuf[i], 16) + " ");

SaveText += "\r\n\r\n";
}
}

if (checkBox1.Checked) //保存到文件 用于数据验证
{
StreamWriter sw = new StreamWriter("temp.txt");

sw.Write(SaveText);

sw.Close();

MessageBox.Show("文件已保存!");
}
  • 打赏
  • 举报
回复
将图片的每一个颜色取一个平均值 --> 将图片的每一个点的三个颜色取一个平均值
  • 打赏
  • 举报
回复
文档很清楚,实现上应该不复杂。

你需要以bit的方式读取要“原样”打印的图片信息,例如你可以把图片装入.net的bitmap对象,这样就可以以GetPixel的方式读取每一个点,来形成[d]k内容。

只不过,你需要将图片的每一个颜色取一个平均值,好判断它是深色还是浅色,以便将颜色变为1、0值。
Rockstone 2011-08-12
  • 打赏
  • 举报
回复
通过蓝牙连接打印机,建立串口 向打印机发送指令
xiang96 2011-08-12
  • 打赏
  • 举报
回复
没有人知道么?我要疯了.....

110,546

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧