Принтер подключен по USB. На принтер отправляются esc/pos команды. Проблема в следующем: изображение печатается очень долго, в среднем уходит 10-15 секунд от начала печати. Для наглядности записал весь процесс на видео: ссылка на видео
Реализация печати:
public void PrintRasterBitImage(Bitmap image)
{
var rw = image.Width;
var rh = image.Height;
var w = (byte)(((rw / 8) + 1) * 8);
var h = (byte)(((rh / 8) + 1) * 8);
if (rw == w - 8)
{
w = (byte)rw;
}
if (rh == h - 8)
{
h = (byte)rh;
}
byte[] cmd1 = { 0x1D, (byte)'*', (byte)(w / 8), (byte)(h / 8) };
Write(cmd1);
int x = 0, y = 0;
byte b = 0;
for (var p = 0; p < w * h;)
{
byte bc;
for (bc = 0; bc < 8; bc++)
{
if (p < rw * rh)
{
var color = image.GetPixel(x, y);
var luma = (int)((color.R * 0.3) + (color.G * 0.59) + (color.B * 0.11));
if (luma > 127)
{
b |= (byte)(1 << (7 - bc));
}
}
y++;
if (y >= rh)
{
x++;
bc += (byte)(h - rh);
y = 0;
}
p++;
}
Write(b);
b = 0;
}
byte[] cmd2 = { 0x1D, (byte)'/', 3 };
Write(cmd2);
}
Метод Write пишет в BinaryWriter
Может кто-то сталкивался со схожей проблемой или знает в чем может быть проблема?
Здравствуйте, HowardLovekraft, Вы писали:
HL>Здравствуйте, serber, Вы писали:
S>>Метод Write пишет в BinaryWriter HL>М.б., вызывать Flush принудительно после каждой записи?
Думаю что надо наоборот, накопить команды в MemoryStream, а потом пульнуть их одним буфером. Чисто догадка, опыта работы с такими девайсами нет.
Здравствуйте, samius, Вы писали:
S>Думаю что надо наоборот, накопить команды в MemoryStream, а потом пульнуть их одним буфером. Чисто догадка, опыта работы с такими девайсами нет.
Скорей всего так и надо делать.
А вообще код страшный.
Что там происходит понять трудно.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Ромашка, Вы писали:
Р>Здравствуйте, serber, Вы писали: S>>Может кто-то сталкивался со схожей проблемой или знает в чем может быть проблема?
Р>В печати рисунка? На кой вам вообще рисунок? Что за рисунок???
Здравствуйте, samius, Вы писали:
S>Здравствуйте, HowardLovekraft, Вы писали:
HL>>Здравствуйте, serber, Вы писали:
S>>>Метод Write пишет в BinaryWriter HL>>М.б., вызывать Flush принудительно после каждой записи?
S>Думаю что надо наоборот, накопить команды в MemoryStream, а потом пульнуть их одним буфером. Чисто догадка, опыта работы с такими девайсами нет.
Flush вызывается после вызова метода печати изображения
Здравствуйте, serber, Вы писали:
S>Здравствуйте, samius, Вы писали:
S>>Думаю что надо наоборот, накопить команды в MemoryStream, а потом пульнуть их одним буфером. Чисто догадка, опыта работы с такими девайсами нет.
S>Flush вызывается после вызова метода печати изображения
Ну и что? Есть какая-то гарантия что данные в устройства не идут побайтово в момент вызова Write(b)?
Здравствуйте, serber, Вы писали:
S>>>>Метод Write пишет в BinaryWriter HL>>>М.б., вызывать Flush принудительно после каждой записи?
S>>Думаю что надо наоборот, накопить команды в MemoryStream, а потом пульнуть их одним буфером. Чисто догадка, опыта работы с такими девайсами нет.
S>Flush вызывается после вызова метода печати изображения
Рекомендую разбить код минимум на 2 функции:
1) Формирование байтового массива команд для принтера (незнаком с этим протоколом, просто смотрел по коду)
Сразу замерить время выполнения, т.к. есть сомнения в производительности GetPixel(), да и размер картинки неизвестен.
2) Отправка на принтер. Тут надо посмотреть размер массива, и сразу прикинуть, сколько времени займет его передача через интерфейс (скорее всего используется виртуальный COM порт с эмуляцией битрейта).
Ну и напоследок: есть какое-то стороннее ПО (может пример из SDK или что-нибудь еще...), которое печатает с приемлемой скоростью?
Здравствуйте, andrey82, Вы писали:
A>Ну и напоследок: есть какое-то стороннее ПО (может пример из SDK или что-нибудь еще...), которое печатает с приемлемой скоростью?
Есть готовая реализация OPOS драйвера, но он печатает еще медленнее.
Здравствуйте, Ромашка, Вы писали:
Р>Здравствуйте, serber, Вы писали: S>>Генерируется квитанция, ее и нужно распечатать.
Р>Ну, где-то так оно и будет печатать. Если хочешь быстрее -- печатай квитанцию текстом.
Конечно, а чтобы распечатать логотип, можно и ascii art вопользоваться
Здравствуйте, samius, Вы писали:
S>Думаю что надо наоборот, накопить команды в MemoryStream, а потом пульнуть их одним буфером.
Если девайс тормозной, то такой подход приведет к тому, что сначала он будет долго и нудно получать команду, а потом также долго, линиями рисовать картинку.
Опыт работы с фекальными регистраторами и чековыми принтерами есть и довольно большой.
ТС, яркость печати какая выставлена? Уменьшить пробовал?
Здравствуйте, Ромашка, Вы писали:
Р>Здравствуйте, serber, Вы писали: S>>Конечно, а чтобы распечатать логотип, можно и ascii art вопользоваться
Р>А логотипы там в отдельную память принтера заливаются. И печатаются вполне себе ESC/POS командами.
Помимо логотипов есть, например, вертикальны/горизонтальные линии, и иные элементы которые в виде текста не представишь. Раз уж стоит задача печатать изображение, что я считаю вполне нормальным, значит на это есть причины. Если была бы возможность ограничится текстом, так бы и сделал
Здравствуйте, serber, Вы писали: S>Помимо логотипов есть, например, вертикальны/горизонтальные линии, и иные элементы которые в виде текста не представишь. Раз уж стоит задача печатать изображение, что я считаю вполне нормальным, значит на это есть причины. Если была бы возможность ограничится текстом, так бы и сделал
А если бы стояла задача печатать фотографии, ты бы на РСДН задавал вопросы как печатать на VKP80 фотографии??? Serber, эта железяка не предназначена для печати графики. Смирись с тормозами или печатай текстом.
Всё, что нас не убивает, ещё горько об этом пожалеет.