代码之家  ›  专栏  ›  技术社区  ›  Clinton Pierce

PCL光栅彩色图形失真。代码包括:我缺少什么?

  •  3
  • Clinton Pierce  · 技术社区  · 16 年前

    下面的函数将彩色光栅图像打印到PCL-5打印机。该功能是从一个2色(1bpp)印刷功能,我们已经很好地工作,除了颗粒2色印刷。问题是,图像出来时会有一个大的黑色条,从图像的右侧延伸到页面的边缘,如下所示:

      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)
        }
    
    1 回复  |  直到 13 年前
        1
  •  4
  •   Douglas Anderson    16 年前

    您的代码有一些问题。首先,您的光标位置代码不正确,应该是:

    "\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查看器之一查看数据,而不是总是打印数据。应该能为你节省一些时间和一两片森林!我已经试过了,Wold建议花89美元购买 pclWorks . 如果您要做大量的PCL,它们也有一个完整的SDK。我们不使用它,因为我们自己硬编码所有PCL,但它看起来不错。

    至于旋转,我们在一些设备上遇到了问题,您可以先旋转JPG(original.rotateflip),然后再写出来。

    我今天时间不多,但希望我的评论能有所帮助。我可以在周一或周二测试您的代码,并使用它并发表任何进一步的评论。

    请记住,尽管PCL是一个标准,但从制造商到制造商以及从设备到设备的支持可能是一个问题,并且有很大的不同。当你做一些基本的事情时,大多数设备看起来都不错;但是,如果你进入宏或者复杂的图形,你会发现不同之处。