3

我编写了一个库,它从一些用户输入创建位图图像。然后使用斑马打印机打印该位图。我遇到的问题是斑马打印机打印的图像上的一切都非常模糊和模糊,但是如果我将位图打印到激光打印机上,它看起来完全正常。以前有没有人遇到过这个问题,如果有,他们是如何解决的?我已经尝试了几乎所有我能想到的明智的打印机设置。

更新了我如何创建位图图像的代码。

public static Bitmap GenerateLabel<T>(T obj, XmlDocument template)
    {
        try
        {
            int width = Convert.ToInt32(template.SelectSingleNode("/LABELS/@width").Value);
            int height = Convert.ToInt32(template.SelectSingleNode("/LABELS/@height").Value);

            if (obj == null || height <= 0 || width <= 0)
                throw new ArgumentException("Nothing to print");

            Bitmap bLabel = new Bitmap(width, height);
            Graphics g = Graphics.FromImage(bLabel);

            XmlNodeList fieldList = template.SelectNodes("/LABELS/LABEL");

            foreach (XmlNode fieldDetails in fieldList)
            {
                //non important code...

                    g.DrawImage(bBarCode, field.Left, field.Top);


                using (TextBox txtbox = new TextBox())
                {
                    // more non important code...

                    Rectangle r = new Rectangle(field.Left, field.Top, field.Width, field.Height);
                    txtbox.DrawToBitmap(bLabel, r);
                }
            }

            return bLabel;
        }
        catch (Exception ex)
        {
            throw new Exception("Unable to create bitmap: " + ex.Message);
        }
    }
4

6 回答 6

5

Zebra 打印驱动程序正在抖动您的输出。要为 Zebra 打印创建完美的图像,您需要创建 203 DPI 和 2 色黑白(1 位)的图像。

于 2010-04-23T20:18:02.893 回答
2

我最终使用了一个名为 Thermal SDK 的第三方库,它允许我绘制/保存我的位图,然后以所需的“特殊”格式将其发送到斑马打印机。它适用于单个标签,但如果您想一次执行多个标签,效率会非常低,因为您必须先将每个标签保存到文件中,然后才能打印它。

于 2010-04-23T20:06:21.547 回答
2

这是所有斑马打印机中的通用“功能”,驱动程序在传输到打印机本身之前使用有损技术压缩图像,据我所知没有解决方法。

于 2010-04-22T09:59:47.680 回答
2

打印机需要 1 bpp 单色图像。并且没有完美的算法将彩色或灰度图像转换为单色。根据图像,此类算法可能会或可能不会产生良好的结果。所以最好的方法是从一开始就准备一个单色的图像,就像上面提到的 Mike Ransom。但如果必须以编程方式完成,则初始彩色图像应仅使用黑白颜色(以便转换产生良好的结果),然后您可以使用这样的算法(此处的源链接):

public static Bitmap BitmapTo1Bpp(Bitmap img)
   {
       int w = img.Width;
       int h = img.Height;

       Bitmap bmp = new Bitmap(w, h, PixelFormat.Format1bppIndexed);
       BitmapData data = bmp.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadWrite, PixelFormat.Format1bppIndexed);

       for (int y = 0; y < h; y++)
       {
           byte[] scan = new byte[(w + 7) / 8];

           for (int x = 0; x < w; x++)
           {
               Color c = img.GetPixel(x, y);
               if (c.GetBrightness() >= 0.5) scan[x / 8] |= (byte)(0x80 >> (x % 8));
           }

           Marshal.Copy(scan, 0, (IntPtr)((int)data.Scan0 + data.Stride * y), scan.Length);
       }

       bmp.UnlockBits(data);

       return bmp;
   }
于 2012-02-01T11:26:59.677 回答
1

答案很简单。Zebra 打印机仅打印黑白,因此在将图像发送到打印机之前,请将其转换为黑白。

我不是 C# 编码器,但 VB 代码看起来很相似,所以我希望他能有所帮助:

    ''' <summary>
''' Converts an image to Black and White
''' </summary>
''' <param name="image">Image to convert</param>
''' <param name="Mode">Convertion mode</param>
''' <param name="tolerance">Tolerancia del colores</param>
''' <returns>Converts an image to Black an white</returns>
''' <remarks></remarks>
Public Function PureBW(ByVal image As System.Drawing.Bitmap, Optional ByVal Mode As BWMode = BWMode.By_Lightness, Optional ByVal tolerance As Single = 0) As System.Drawing.Bitmap
    Dim x As Integer
    Dim y As Integer
    If tolerance > 1 Or tolerance < -1 Then
        Throw New ArgumentOutOfRangeException
        Exit Function
    End If
    For x = 0 To image.Width - 1 Step 1
        For y = 0 To image.Height - 1 Step 1
            Dim clr As Color = image.GetPixel(x, y)
            If Mode = BWMode.By_RGB_Value Then
                If (CInt(clr.R) + CInt(clr.G) + CInt(clr.B)) > 383 - (tolerance * 383) Then
                    image.SetPixel(x, y, Color.White)
                Else
                    image.SetPixel(x, y, Color.Black)
                End If
            Else
                If clr.GetBrightness > 0.5 - (tolerance / 2) Then
                    image.SetPixel(x, y, Color.White)
                Else
                    image.SetPixel(x, y, Color.Black)
                End If
            End If
        Next
    Next
    Return image
End Function
于 2010-07-28T18:15:15.530 回答
1

曾经要看的地方是驱动程序设置,打印机上的dpi是多少,有很多设置可能会导致效果,而不仅仅是有损技术。

我们已经向斑马发送了许多位图图像,并且它应该可以工作

于 2010-04-23T20:00:36.157 回答