将PNG图像转换为ZPL代码

时间:2018-04-12 14:18:56

标签: c# .net png zpl

我需要使用ZPL打印机将PNG图像打印到标签上。我们的想法是将PNG图像转换为单色图像,然后使用图像数据生成必要的ZPL代码以打印图像。

经过一些谷歌搜索和编码,我有一段代码可以做到这一点。生成的ZPL代码在labelary(http://labelary.com)上似乎很好。

生成ZPL代码的代码主要是从这里获取的 - > How to optimize ASCII HEX for BMP to ZPL as using in Labelary

不幸的是,当尝试使用生成的ZPL代码打印标签时,它会像这样出现: Not supposed to look like this

图片应如下所示: ImageToConvert

我使用的代码是:

static void Main(string[] args)
    {

        // 1. Convert Image to monochrome bmp
        string bitmapFilePath = @"somepath.bmp";
        Bitmap imageToConvert = new Bitmap(bitmapFilePath);
        var rectangle = new Rectangle(0, 0, imageToConvert.Width, imageToConvert.Height);
        Bitmap monochromeImage = imageToConvert.Clone(rectangle, PixelFormat.Format1bppIndexed);

        // Mirror image
        monochromeImage.RotateFlip(RotateFlipType.Rotate180FlipX);

        // Save mono image            
        monochromeImage.Save("somePathMono.bmp", ImageFormat.Bmp);

        // 2. Convert to ZPL
        ConvertImage();   

    }

    public static void ConvertImage()
    {
        string bitmapFilePath = "somePathMono.bmp";
        int w, h;
        Bitmap b = new Bitmap(bitmapFilePath);
        w = b.Width; h = b.Height;
        byte[] bitmapFileData = System.IO.File.ReadAllBytes(bitmapFilePath);
        int fileSize = bitmapFileData.Length;

        int bitmapDataOffset = int.Parse(bitmapFileData[10].ToString()); ;
        int width = w; // int.Parse(bitmapFileData[18].ToString()); ;
        int height = h; // int.Parse(bitmapFileData[22].ToString()); ;
        int bitsPerPixel = int.Parse(bitmapFileData[28].ToString()); 
        int bitmapDataLength = bitmapFileData.Length - bitmapDataOffset;
        double widthInBytes = Math.Ceiling(width / 8.0);

        while (widthInBytes % 4 != 0)
        {
            widthInBytes++;
        }

        // Copy over the actual bitmap data without header data            
        byte[] bitmap = new byte[bitmapDataLength];

        Buffer.BlockCopy(bitmapFileData, bitmapDataOffset, bitmap, 0, bitmapDataLength);           

        // Invert bitmap colors
        for (int i = 0; i < bitmapDataLength; i++)
        {
            bitmap[i] ^= 0xFF;
        }             

        // Create ASCII ZPL string of hexadecimal bitmap data
        string ZPLImageDataString = BitConverter.ToString(bitmap);            
        ZPLImageDataString = ZPLImageDataString.Replace("-", string.Empty);

        // Add new line every 1023 chars characters
        string ZPLImageDataStringWithNewLine = SpliceText(ZPLImageDataString, 1023);            

        // Create ZPL command to print image
        string ZPLCommand = string.Empty;

        ZPLCommand += "^XA";
        ZPLCommand += "^FO20,20";
        ZPLCommand +=
        "^GFA," +
        bitmapDataLength.ToString() + "," +
        bitmapDataLength.ToString() + "," +
        widthInBytes.ToString() + "," +
        System.Environment.NewLine +
        ZPLImageDataStringWithNewLine;

        ZPLCommand += "^XZ";

        System.IO.StreamWriter sr = new System.IO.StreamWriter("zplCodePath", false, System.Text.Encoding.Default);

        sr.Write(ZPLCommand);
        sr.Close();       
    }

    public static string SpliceText(string text, int lineLength)
    {
        return Regex.Replace(text, "(.{" + lineLength + "})", "$1" + Environment.NewLine);
    }

我们使用Zebra ZT 410打印机

有人可以帮我弄清问题是什么吗?我现在没有想法。

谢谢!

更新:似乎问题是我在图像数据中的每个x字符之后添加的换行符。我不明白为什么。我的代码适用于较小的图像(我不需要放置新的行),但对于带有长图像数据字符串的大图像,如果我不放置新行,则不会打印。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

因为我在ZPL指南和提供不同解决方案的各种参考中遇到了此类问题(似乎永远无法完全与我的用例一起使用),所以我创建了一个简单的.net core application,它使用标签图像并将其转换为ZPL ,既可以传输到文件(如果提供了输出),也可以直接传输到控制台,因此可以在bash脚本中通过管道传输。