Как улучшить скорость печати изображений ESC / POS Thermal_Printer? - PullRequest
0 голосов
/ 17 апреля 2020

Я выполняю задание на печать с Термопринтером для печати изображений на портативном термопринтере в течение нескольких недель, и это код, который я получил для печати изображений.

        public static byte[] GetByteImage(Bitmap bm, int BitmapWidth)
        {
            BitmapData data = GetGreyScaledBitmapData(bm, BitmapWidth);
            BitArray dots = data.Dots;
            string t = data.Width.ToString();
            byte[] width = BitConverter.GetBytes(data.Width);

            int offset = 0;
            MemoryStream stream = new MemoryStream();
            BinaryWriter bw = new BinaryWriter(stream);

            //Line spacing
            bw.Write((char)0x1B);
            bw.Write('3');
            bw.Write((byte)0);


            while (offset < data.Height)
            {
                //Declare printer to print image mode
                bw.Write((char)0x1B);
                bw.Write('*');
                bw.Write((byte)33);
                bw.Write(width[0]);
                bw.Write(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));
                        }

                        bw.Write(slice);
                    }
                }
                offset += 24;
                bw.Write((char)0x0A);
            }
            bw.Write((char)0x1B);
            bw.Write('3');
            bw.Write((byte)0);

            bw.Flush();
            byte[] bytes = stream.ToArray();
            return bytes;
        }

        public static BitmapData GetGreyScaledBitmapData(Bitmap bmpFileName, double imgsize)
        {
            using (var bitmap = (Bitmap)(bmpFileName))
            {
                var threshold = 127;
                var index = 0;
                double multiplier = imgsize;
                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);
                        Android.Graphics.Color color = new Android.Graphics.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)
                };
            }
        }

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

            public int Height
            {
                get;
                set;
            }

            public int Width
            {
                get;
                set;
            }
        }

Проблема в том, что печать очень медленная и издают дребезжащий звук во время печати. Другая проблема заключается в том, что метод преобразования изображений в оттенки серого немного медленный.

И когда я тестировал с другими приложениями, я обнаружил, что у них нет рывков и практически мгновенно печатает изображение после нажатия кнопки печати. ​​

Есть ли способ улучшить вышеуказанный код, чтобы он мог плавно печатать?

Это приложение, которое я тестировал Printer Lab - Диспетчер термопринтеров

The Thermal Принтер, который я использовал RPP300 Мобильный принтер 72 мм

1 Ответ

0 голосов
/ 17 апреля 2020

Используемая вами команда ES C * печатает каждые 24 точки по высоте.

Тогда, как только вы почувствуете проблему, печать будет прерывистой и медленной.

Пожалуйста, используйте комбинацию команд GS * и GS / для улучшения.

Подробная информация об их технических характеристиках приведена на стр. 24–26 Руководства по набору команд термального мобильного принтера.


Кроме того:

Кстати, я пропускал другую команду.
Нам было бы проще создать данные, которые мы будем отправить.
Однако плавная печать зависит от производительности принтера и скорости линии связи.

Эта команда GS v 0. Она описана на страницах 32 и 33 руководства.


Программа в этой статье представляет собой процесс преобразования данных битового изображения для команд FS q и GS (L / GS 8 L, но ее также можно использовать для команд GS *. Попробуйте ее.
Преобразовать данные растрового байта [] в столбец Формат в C#

...