下面的功能将彩色光栅图像打印到PCL-5打印机。该功能是从我们的双色(1bpp)打印功能改编而来的,除了颗粒状的双色打印外,它工作得很好。问题是图像出来时有一个很大的黑条,从图像的右边延伸到页面的边缘,如下所示:
IMAGE#########################################
IMAGE#########AREA COMPLETELY BLACK###########
IMAGE#########################################图像本身看起来很完美,否则。
各种从PCL到PDF的工具根本不显示图像,这让我相信我忘记了对某些东西做了什么。之前发送了相应的重置(\u001bE\u001b%-12345X),之后发送了页面馈送。
有PCL专家吗?我有PCL5颜色技术参考手册,它让我走到了这一步。最后一件事快把我逼疯了。
*编辑:我现在知道是什么命令导致了问题,但我不知道为什么:
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)
}发布于 2008-11-22 13:37:13
你的代码有一些问题。首先,您的光标位置代码不正确,应为:
"\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是一个标准,它的支持从制造商到制造商和设备到设备可能是一个问题,并且有很大的不同。在做基本的事情时,大多数设备看起来都不错;但是,如果你使用宏或复杂的图形,你会发现不同之处。
https://stackoverflow.com/questions/309150
复制相似问题