Проблема с качеством печати изображения на принтере чеков (термопринтер)
Есть 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);
}
Конечно я вручную меняю размер картинки что б подогнать под размер печати, но принтер этим не занимается.