Печать изображений на Epson-совместимом термопринтере.

Я использую C# и пишу код для печати содержимого для термального принтера билетов. Есть коды, которые люди используют для печати изображений, и они действительно печатают изображение, но что-то идет не так. Это мой код для класса печати изображений, он широко использует открытый исходный код (я погуглил и нашел его, и люди успешно внедряют этот код в свой без проблем).

      public static class ImagePrint
{
    /// <summary>
    /// Image convert to Byte Array
    /// </summary>
    /// <param name="LogoPath">Image Path</param>
    /// <param name="printWidth">Image print Horizontal Length</param>
    /// <returns></returns>
    public static byte[] GetLogo(string LogoPath, int printWidth)
    {
        List<byte> byteList = new List<byte>();
        if (!File.Exists(LogoPath))
            return null;
        BitmapData data = GetBitmapData(LogoPath, printWidth);
        BitArray dots = data.Dots;
        byte[] width = BitConverter.GetBytes(data.Width);

        int offset = 0;
        // Initialize Printer
        byteList.Add(Convert.ToByte(Convert.ToChar(0x1B)));
        byteList.Add(Convert.ToByte('@'));

        // Line Spacing Adjust (24/180 inch)
        byteList.Add(Convert.ToByte(Convert.ToChar(0x1B)));
        byteList.Add(Convert.ToByte('3'));
        byteList.Add((byte)24);
        while (offset < data.Height)
        {
            byteList.Add(Convert.ToByte(Convert.ToChar(0x1B)));
            byteList.Add(Convert.ToByte('*'));
            byteList.Add((byte)33);
            byteList.Add(width[0]);
            byteList.Add(width[1]);

            for (int x = 0; x < data.Width; ++x)
            {
                for (int k = 0; k < 3; ++k)
                {
                    byte slice = 0;
                    for (int b = 0; b < 8; ++b)
                    {
                        int y = (((offset / 8) + k) * 8) + b;
                        int i = (y * data.Width) + x;

                        bool v = false;
                        if (i < dots.Length)
                            v = dots[i];

                        slice |= (byte)((v ? 1 : 0) << (7 - b));
                    }
                    byteList.Add(slice);
                }
            }
            offset += 24;
            byteList.Add(Convert.ToByte(0x0A));
        }

        // Return to normal line spacing (30/160 inch)
        byteList.Add(Convert.ToByte(0x1B));
        byteList.Add(Convert.ToByte('3'));
        byteList.Add((byte)30);
        return byteList.ToArray();
    }

    private static BitmapData GetBitmapData(string bmpFileName, int width)
    {
        using (var bitmap = (Bitmap)Bitmap.FromFile(bmpFileName))
        {
            var threshold = 127;
            var index = 0;
            double multiplier = width; // 이미지 width조정
            double scale = (double)(multiplier / (double)bitmap.Width);
            int xheight = (int)(bitmap.Height * scale);
            int xwidth = (int)(bitmap.Width * scale);
            var dimensions = xwidth * xheight;
            var dots = new BitArray(dimensions);

            for (var y = 0; y < xheight; y++)
            {
                for (var x = 0; x < xwidth; x++)
                {
                    var _x = (int)(x / scale);
                    var _y = (int)(y / scale);
                    var color = bitmap.GetPixel(_x, _y);
                    var luminance = (int)(color.R * 0.3 + color.G * 0.59 + color.B * 0.11);
                    dots[index] = (luminance < threshold);
                    index++;
                }
            }

            return new BitmapData()
            {
                Dots = dots,
                Height = (int)(bitmap.Height * scale),
                Width = (int)(bitmap.Width * scale)
            };
        }
    }

    private class BitmapData
    {
        public BitArray Dots
        {
            get;
            set;
        }

        public int Height
        {
            get;
            set;
        }

        public int Width
        {
            get;
            set;
        }
    }
}

И я использую этот код в моем коде для печати изображений:

      string Image_File_Path = @"D:\TEST\TESTImage.bmp";
int Image_Size_I_Wait = 100;
byte[] img = ImagePrint.GetLogo(Image_File_Path, Image_Size_I_Want);
port.Write(img, 0, img.Length);

Вы можете увидеть результат на прикрепленной картинке. На изображении есть белые пробелы. Этот класс автоматически добавляет команду межстрочного интервала, но, похоже, не работает. Пожалуйста, предложите любое решение. Заранее всем спасибо.

Печать плохого изображения

1 ответ

Использование пакета mike42/escpos-php в laravel

      
use Mike42\Escpos\Printer;
use Mike42\Escpos\EscposImage;

 $tux = EscposImage::load(public_path()."\assets\img\path-to-file.jpg");
 $printer->setJustification(Printer::JUSTIFY_CENTER);
 $printer->bitImage($tux, 0);
 $printer -> setJustification();
Другие вопросы по тегам