下面的函数将彩色光栅图像打印到 PCL-5 打印机。该功能改编 self 们拥有的 2 色 (1bpp) 打印功能,除了颗粒状的 2 色打印外,它工作得很好。问题是图像出现了一个大黑条,从图像右侧延伸到页面边缘,如下所示:
IMAGE#########################################
IMAGE#########AREA COMPLETELY BLACK###########
IMAGE#########################################
图像本身看起来很完美,否则。
各种 PCL 到 PDF 的工具根本不显示图像,这让我相信我忘记了做某事。之前发送了适当的重置 (\u001bE\u001b%-12345X),之后发送了页面。
那里有 PCL 专家吗?我有 PCL 5 颜色技术引用手册,它让我走到了这一步。不过,最后一件事让我发疯。
*编辑: 我现在知道是什么命令导致了这个问题,但我不知道为什么:
stream("\u001b*r0F");
这应该使图像随页面一起旋转(纵向、横向)。如果我删除它,问题就会消失。我可以通过事先旋转位图来补偿,但我真的很想知道是什么原因造成的!
static void PrintImage()
{
// Get an image into memory
Image original = Image.FromFile("c:\\temp\\test.jpg");
Bitmap newBitmap = new Bitmap(original, original.Width, original.Height);
stream(String.Format("\u001b*p{0:d}x*p{1:d}Y", 1000, 1000));// Set cursor.
stream("\u001b*t300R"); // 300 DPI
stream(String.Format("\u001b*r{0:d}T", original.Height)); // Height
stream(String.Format("\u001b*r{0:d}S", original.Width)); // Width
stream("\u001b*r3U"); // 8-bit color palette
stream("\u001b*r0F"); // Follow logical page layout (landscape, portrait, etc..)
// Set palette depth, 3 bytes per pixel RGB
stream("\u001b*v6W\u0000\u0003\u0000\u0008\u0008\u0008");
stream("\u001b*r1A"); // Start raster graphics
stream("\u001b*b0M"); // Compression 0 = None, 1 = Run Length Encoding
// Not fast, but fast enough.
List<byte> colors = new List<byte>();
for (int y2 = 0; y2 < original.Height; y2++)
{
colors.Clear();
for (int x2 = 0; x2 < original.Width; x2++)
{
Color c = newBitmap.GetPixel(x2, y2);
colors.Add(c.R);
colors.Add(c.G);
colors.Add(c.B);
}
stream(String.Format("\u001b*b{0}W", colors.Count)); // Length of data to send
streamBytes(colors.ToArray()); // Binary data
}
stream("\u001b*rB"); // End raster graphics (also tried *rC -- no effect)
}
最佳答案
您的代码存在一些问题。首先你的光标位置代码不正确,它应该是:
"\u001b*p{0:d}x1:d}Y", 1000, 1000
这相当于:
<esc>*p1000x1000Y
你有:
<esc>*p1000x*p1000Y
将 PCL 命令连接在一起时,您匹配相同的参数化值和组,然后简单地添加值 + 参数化字符 + 值 + 参数化字符等。确保最后的参数化字符是表示 PCL 命令结束的大写字母.
此外,在定义图像时,我建议您还以分点为单位指定宽度和高度,这应该有助于页面上图像 (*r3A) 的缩放,所以添加这个(就在您的分辨率命令之后应该是一个不错的地方为此):
Int32 deciHeight = original.Height / (int)original.HorizontalResolution * 720;
Int32 deciWidth = original.Width / (int)original.VerticalResolution * 720;
stream("\u001b*t{0:d}h{1:d}V", deciHeight, deciWidth));
另一个建议是将所有这些写入文件(观察您的编码)并使用少数 PCL 查看器之一来查看您的数据,而不是始终打印它。应该可以为您节省一些时间和一两片森林!我已经尝试了所有这些,并建议花 89 美元购买 pclWorks .如果您要进行大量 PCL,他们也有完整的 SDK。我们不使用它,因为我们自己对所有 PCL 进行了硬编码,但它看起来确实不错。
至于旋转,我们在某些设备上遇到了问题,您可以先旋转 jpg (original.RotateFlip),然后再写出来。
我今天没有太多时间,但希望我的意见对您有所帮助。我可以在星期一或星期二测试您的代码并使用它并发表任何进一步的评论。
请记住,尽管 PCL 是一项标准,但制造商与制造商之间以及设备与设备之间的支持可能存在很大差异。在做基本的事情时,大多数设备看起来都不错;但是,如果您使用宏或复杂图形,您会发现不同之处。
关于c# - PCL 光栅彩色图形失真。包含代码 : what am I missing?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/309150/