ESC/POS растровые данные для изображения
Мы можем преобразовать изображение в байтовый массив для отправки на принтер ESC/POS.
Я использую код здесь: /questions/35455899/pechat-izobrazheniya-bitovoj-kartyi-na-pos-printere-cherez-comport-v-c/35455913#35455913
это работает как шарм.
простой вопрос: возможно ли преобразовать этот байтовый массив обратно в исходное изображение?
если да, пожалуйста, скажите мне, как...
большая картина:
Я создал слушатель TCP/IP, который действует как принтер POS.
Он получает данные из POS-приложения, а затем перенаправляет их на настоящий принтер.
между прочим, я должен получить продукты на квитанции и напечатать что-то дополнительное на основе продуктов.
Итак, мне нужно преобразовать графические данные в изображение (затем OCR), чтобы прочитать продукты при получении.
вот одна полученная квитанция ESC/POS:
pastebin.com/vUDHjGuj
(Мы можем преобразовать его в байтовый массив, а затем отправить на принтер. Он напечатает квитанцию.)
Я знаю структуру захваченных данных. мы можем удалить команды ESC/POS и разделить массив на 0x0A LF. Мне просто нужен способ преобразовать графические байтовые массивы в изображение и соединить их вместе, чтобы создать изображение чека.
графический режим, отправляемый на принтер: 24-битная удвоенная плотность (0x1B 0x2A 0x21)
пожалуйста помоги...
большое спасибо
ниже одна из частей, которые я пробовал, но она дает все черное.
Я отправляю один фрагмент (byte[]), с шириной =512 (из захваченных данных), высотой: 1 (или любой)
public static Bitmap FromByteArray(byte[] ByteArray, Size Size)
{
Bitmap bmp = new Bitmap(Size.Width, Size.Height, PixelFormat.Format24bppRgb);
BitmapData bmpdata = bmp.LockBits(new Rectangle(0, 0, Size.Width, Size.Height),ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
IntPtr ptr = bmpdata.Scan0;
System.Runtime.InteropServices.Marshal.Copy(ByteArray, 0, ptr, ByteArray.Length);
bmp.UnlockBits(bmpdata);
return bmp;
}
1 ответ
Вы работаете с языком описания страниц принтера, поэтому сначала имейте в виду, что это не задача начального уровня.
В вашем коде нет конкретного "исправления". Похоже, что он основан на некоторых предположениях, которые не основаны на реалиях этого формата данных.
- Ваш образец файла является изображением? Нет, в файле также есть другие команды (cut, newline), которые вам нужно уметь анализировать и игнорировать для получения данных изображения.
- Ваш образец файла одного изображения? Нет, в вашем образце 20 небольших изображений в виде тонких кусочков.
- Ваше изображение 24 бит на пиксель? Нет, на пиксель приходится один бит, расположенных в столбцах высотой 24 пикселя. Каждое изображение имеет произвольную ширину, которую вы можете прочитать из данных.
- Растровые данные выложены в строках? Нет, это колонна мажор.
Поэтому, если вы хотите работать с кодом C#, как упомянуто в комментарии, вам нужно правильно изменить процесс в примере C#, который вы связали. Вы можете сообщить об этом с помощью хорошего отладчика, копии документации Epson для ESC *
и несколько небольших примеров файлов для конвертации.
пример
Абсолютно возможно проанализировать ESC/POS, чтобы восстановить исходное изображение. Я поддерживаю проект с открытым исходным кодом, который делает это, и он обработает ваш пример файла ( github, соответствующий пост в блоге). Код для разбора ESC *
находится в SelectBitImageMode.php. Это не C#, но это работает.
Я должен был преобразовать ваш пример файла обратно в двоичный файл, чтобы использовать его:
cat esc_pos_graphics_printing_data.txt | tr -d '\r' | tr -d '\n' | \
python3 -c "import sys, binascii; sys.stdout.buffer.write(binascii.unhexlify(input().strip()))" > \
esc_pos_graphics_printing_data.bin
Затем, чтобы извлечь изображения из квитанции и присоединиться к ним, я использовал escpos-tools
(git
, composer
, php
) плюс ImageMagick
:
git clone https://github.com/receipt-print-hq/escpos-tools.git
cd escpos-tools
composer install
php escimages.php --file ../esc_pos_graphics_printing_data.bin
convert esc_pos_graphics_printing_data-*.png -append output.png
Квитанция является:
Удачи!