Как использовать команду ESC/POS «GS v 0»

пожалуйста, кто-нибудь может объяснить команду «GS v 0»? Я хочу напечатать растровое изображение на своем термопринтере. Не могу понять параметры xL xH yL...

Следующее находится в руководстве по программированию, но до сих пор я не вижу решения.

ASCII: Gs v 0 Десятичный: 29 118 48 m xL xH yL yH [d]k Шестнадцатеричный: 1D 76 30 m xL xH yL yH [d]k

0 ≤ m ≤ 3, 48 ≤ m ≤ 51 0 ≤ xL ≤ 255 0 ≤ xH ≤ 255 0 ≤ yL ≤ 255 0 ≤ d ≤ 255 k = ( xL + xH × 256) × ( yL + yH × 256) ( k ≠ 0)

xL, xH определяет (xL + xH × 256) байтов в горизонтальном направлении для битового изображения. yL, yH определяет (yL + yH × 256) точек в вертикальном направлении для битового изображения. [d]k определяет данные битового изображения (растровый формат).


person Mexxchen    schedule 14.06.2016    source источник
comment
Кажется, это устарело, альтернативный способ печати — ESC * и здесь вы можете найти информацию   -  person William Ardila    schedule 02.08.2017


Ответы (2)


Сначала позвольте мне сказать, что я знаю, что вопрос старый, и эта команда считается устаревшей, но все еще существует огромный рынок термопринтеров, которые принимают эту команду.

Недостаточно баллов на этой учетной записи, чтобы написать комментарий к ответу @Fewl.

Он прав в отношении yL и yH, но не в отношении xL и xH.

xL, xH определяет (xL + xH × 256) байтов по горизонтали для битового изображения.

yL, yH указывает (yL + yH × 256) точек в вертикальном направлении для битового изображения.

Ссылка: https://www.epson-biz.com/modules/ref_escpos/index.php?content_id=94

Допустим, ваше растровое изображение имеет ширину 384 пикселя и высоту 260 пикселей, тогда:

xL = width % 2048 / 8;
xH = width / 2048;
// width = 384
// xL = 48
// xH = 0
// (xL + xH × 256) = 48 + 0 x 256 = 48 **bytes** in horizontal direction.


yL = height % 256;
yH = height / 256;
//height = 260
// yL = 4
// yH = 1
// (yL + yH × 256) = 4 + 1 x 256 = 260 **dots** in vertical direction

Объяснение, пример битового изображения имеет 384/8 = 48 байтов в горизонтальном направлении, так как 48 ‹ 256 вам не нужно вычислять xH (старший байт), он будет равен 0. Вам нужно будет вычислить xH, только если ваше растровое изображение шире чем 8 * 256 = 2048 точек ... Что маловероятно для термопринтеров, но я включил даже этот сценарий в приведенный выше код.

Важная заметка! Ширина моего примера (384) делится на 8. Если это не так, вам придется учесть это, округлив деление и дополнив битовые данные нулями... или просто заранее измените размер растрового изображения, чтобы его ширина делилась на 8.

person Uroš    schedule 16.02.2020
comment
Откуда 2048? - person vesperto; 14.06.2021
comment
Я уже рассказывал об этом в своем объяснении: вам нужно будет вычислить xH только в том случае, если ваше растровое изображение шире, чем 8 * 256 = 2048 точек, вот откуда берется 2048. Если растровое изображение имеет ширину менее 2048 точек, вам не нужна операция по модулю для xL (просто разделите ширину на 8) и, очевидно, вам не нужно вычислять xH, оно будет равно 0. - person Uroš; 15.06.2021

Как уже упоминалось, команда GS v 0 устарела, вместо нее следует попробовать ESC * или GS ( L / GS 8 L.

Но, просто чтобы ответить на вопрос...

Как известно, xL, xH относится к ширине растрового изображения, а yL, yH к высоте.

Вы сказали, что эти значения должны быть между 0 и 255, и для достижения этого вы делаете следующее:

xL = width % 256
xH = width / 256
yL = height % 256
yH = height / 256

Итак, допустим, у вас есть изображение размером 300x200. Эти значения будут:

xL = 44, xH = 1, yL = 200, yH = 0 (десятичное число)

k = (44 + 1 * 256) * (200 + 0 * 256) = 60 000 (300 x 200)

С помощью шестнадцатеричной команды вы получите: 1D 76 30 m 2C 01 C8 00 [d]k, где m — это режим, а [d]k — это данные изображения объемом 60 000 байт.

person Fewl    schedule 27.06.2019
comment
Существует также команда ESC/P2 ESC., которая принимает полные растровые изображения. Не нужно резать рядами. Это замена GSv0 ? - person Sandburg; 22.11.2019