Проблема с качеством печати изображения на принтере чеков (термопринтер)

Рейтинг: 0Ответов: 1Опубликовано: 24.05.2023

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

Флоу данный следующий: Данные о чеке -> Реакт элемент чека -> jpg из элемента -> Отправляем картинку на сервер -> сервер загружает картинку в облако и получает ссылку -> добавляет в очередь печати -> агент получает очередь печати и скачивает картинку чека -> пытается печатать.

Получаем следующее: введите сюда описание изображения

Качество печати ужасное. Пытаемся понять почему, уже реализована печать чеков с использованием FastReport, там чеки печатаются отлично: чек

Слева можем видеть чек фастрепорта.

Задача : добиться высокого качества печати чека.

Очевидно, что принтер плохо переносит изображения, не понятно почему ведь он может печатать куар коды с высоким качеством. Нужно понимать, что этот принтер выжигает пиксели на бумаге, и он может быть либо черным либо белым, никаких серых цветов быть не может. С целью проверки теории о том, что если скормить ему чисто чб изображение, то качество будет лучше, печатаем картинку: введите сюда описание изображения

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

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

UPD

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

Печатаю вот так.

MemoryStream imageStream = new MemoryStream(e2.Result);
                    //Bitmap imageBitmap = new Bitmap(imageStream);
                    Image image = Image.FromStream(imageStream);

                    var setting = new PrinterProps { copies = 1, pageWight = int.Parse(textBox1.Text), printerName = textBox3.Text };
                    double k = setting.pageWight / (double)image.Width;
                    double hight = (double)image.Height * k;
                    var size = new Size(setting.pageWight, (int)Math.Round(hight));
                    sz = size;
                    //imageBitmap = new Bitmap(imageBitmap, size);
                    //imageBitmap.SetResolution(int.Parse(textBox4.Text), int.Parse(textBox4.Text));
                    pictureBox1.Image = image;
                    pictureBox1.Size = image.Size;

                    printDocument.PrinterSettings.PrinterName= setting.printerName;
                    printDocument.DefaultPageSettings.PaperSize = new PaperSize("MyPaper", (int)(size.Width/ 0.254), (int)(size.Height/ 0.254));
                    printDocument.Print();
private void printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            var image = pictureBox1.Image;

            e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
            e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            // Calculate scale factor
            float pageWidth = (int)(sz.Width/0.254);
            float pageHeight = (int)(sz.Height / 0.254);
            //MessageBox.Show($"{pageHeight} {pageWidth}");
            float imageWidth = image.Width;
            float imageHeight = image.Height;

            float scaleX = pageWidth / imageWidth;
            float scaleY = pageHeight / imageHeight;
            float scale = Math.Min(scaleX, scaleY);

            // Calculate scaled image size
            int scaledWidth = (int)(imageWidth * scale);
            int scaledHeight = (int)(imageHeight * scale);

            // Draw the scaled image on the page
            e.Graphics.DrawImage(image, 0, 0, scaledWidth, scaledHeight);

        }

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

Ответы

▲ 0

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