PCL光栅彩色图形失真。代码包括:我错过了什么?

时间:2008-11-21 15:43:14

标签: c# graphics printer-control-language

以下功能将彩色光栅图像打印到PCL-5打印机。除了颗粒状双色印刷外,该功能采用了我们完美的双色(1bpp)印刷功能。问题是图像出现了一个从图像右侧延伸到页面边缘的大黑条,如下所示:

  IMAGE#########################################
  IMAGE#########AREA COMPLETELY BLACK###########
  IMAGE#########################################

图像本身看起来很完美,否则。

各种PCL-to-PDF工具根本不显示图像,这让我相信我已经忘记做某事了。之前发送了适当的重置(\ u001bE \ u001b%-12345X),之后发送了页面反馈。

那里有PCL专家吗?我已经拿到了PCL 5 Color技术参考手册,它让我走到了这一步。最后这件事让我疯狂。

*编辑: 我现在知道导致问题的命令,但我不知道为什么:

  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)
    }

1 个答案:

答案 0 :(得分:4)

您的代码存在一些问题。首先关闭光标位置代码是不正确的,它应该是:

"\u001b*p{0:d}x1:d}Y", 1000, 1000

这相当于:

<esc>*p1000x1000Y
你有:

<esc>*p1000x*p1000Y

将PCL命令连接在一起时,匹配相同的参数化值和组,然后简单地添加值+参数化字符+值+参数化字符等。确保最终参数化字符是大写字母,表示PCL命令的结束

同样在定义图像时,我建议您同时指定宽度和宽度。在decipoints中,这应该有助于在页面上缩放图像(* 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是标准,但从制造商到制造商以及设备到设备的支持可能是一个问题而且差别很大。做基本的事情时,大多数设备似乎都没问题;但是,如果你进入宏或复杂的图形,你会发现不同。