Приведенная ниже функция позволяет распечатать цветное растровое изображение на принтере PCL-5. Эта функция была адаптирована из имеющейся у нас функции двухцветной печати (1 бит на пиксель), которая работала отлично, за исключением зернистой двухцветной печати. Проблема в том, что изображение выходит с большой черной полосой, идущей от правого края изображения до края страницы, например:
IMAGE#########################################
IMAGE#########AREA COMPLETELY BLACK###########
IMAGE#########################################
В остальном само изображение выглядит идеально.
Различные инструменты преобразования PCL в PDF вообще не отображают изображение, что наводит меня на мысль, что я забыл что-то сделать. Соответствующие сбросы (\ u001bE \ u001b% -12345X) были отправлены раньше, а каналы страниц - после.
Есть какие-нибудь эксперты по PCL? У меня есть Техническое справочное руководство по цветам PCL 5, и оно меня зашло так далеко. Это последнее, однако, сводит меня с ума.
*Редактировать: Теперь я знаю, какая команда вызывает проблему, но не знаю почему:
stream("\u001b*r0F");
При этом изображение должно быть повернуто вместе со страницей (книжная, альбомная). Если я удалю это, проблема исчезнет. Я могу компенсировать это, предварительно повернув растровое изображение, но я действительно хочу знать, чем это вызвано!
static void PrintImage()
{
// Get an image into memory
Image original = Image.FromFile("c:\\temp\\test.jpg");
Bitmap newBitmap = new Bitmap(original, original.Width, original.Height);
stream(String.Format("\u001b*p{0:d}x*p{1:d}Y", 1000, 1000));// Set cursor.
stream("\u001b*t300R"); // 300 DPI
stream(String.Format("\u001b*r{0:d}T", original.Height)); // Height
stream(String.Format("\u001b*r{0:d}S", original.Width)); // Width
stream("\u001b*r3U"); // 8-bit color palette
stream("\u001b*r0F"); // Follow logical page layout (landscape, portrait, etc..)
// Set palette depth, 3 bytes per pixel RGB
stream("\u001b*v6W\u0000\u0003\u0000\u0008\u0008\u0008");
stream("\u001b*r1A"); // Start raster graphics
stream("\u001b*b0M"); // Compression 0 = None, 1 = Run Length Encoding
// Not fast, but fast enough.
List<byte> colors = new List<byte>();
for (int y2 = 0; y2 < original.Height; y2++)
{
colors.Clear();
for (int x2 = 0; x2 < original.Width; x2++)
{
Color c = newBitmap.GetPixel(x2, y2);
colors.Add(c.R);
colors.Add(c.G);
colors.Add(c.B);
}
stream(String.Format("\u001b*b{0}W", colors.Count)); // Length of data to send
streamBytes(colors.ToArray()); // Binary data
}
stream("\u001b*rB"); // End raster graphics (also tried *rC -- no effect)
}





Есть несколько проблем с вашим кодом. Во-первых, ваш код позиции курсора неверен, он должен читать:
"\u001b*p{0:d}x1:d}Y", 1000, 1000
Это равносильно:
<esc>*p1000x1000Y
ты имел:
<esc>*p1000x*p1000Y
При объединении команд PCL вы сопоставляете одно и то же параметризованное значение и группу, а затем просто добавляете значение + параметризованный символ + значение + параметризованный символ и т. д. Убедитесь, что последний параметризованный символ - это заглавная буква, обозначающая конец команды PCL.
Также при определении изображения я рекомендую вам также указать ширину и высоту в десятичных точках, это должно помочь с масштабированием изображения (* r3A) на странице, поэтому добавьте это (сразу после того, как ваша команда разрешения должна быть подходящим местом для этого) :
Int32 deciHeight = original.Height / (int)original.HorizontalResolution * 720;
Int32 deciWidth = original.Width / (int)original.VerticalResolution * 720;
stream("\u001b*t{0:d}h{1:d}V", deciHeight, deciWidth));
Другая рекомендация - записать все это в файл (следить за своими кодировками) и использовать одну из горстки программ просмотра PCL для просмотра ваших данных, а не всегда их печатать. Должно сэкономить время и пару лесов! Я перепробовал их все и рекомендую потратить 89 долларов и купить pclWorks. У них также есть полный SDK, если вы собираетесь много работать с PCL. Мы не используем это, поскольку сами жестко кодируем весь PCL, но он выглядит хорошо.
Что касается вращения, у нас были проблемы на некоторых устройствах. Вы могли просто сначала повернуть jpg (original.RotateFlip), а затем записать его.
У меня сегодня мало времени, но надеюсь, что мои комментарии помогут. Я могу протестировать ваш код в понедельник или вторник, поработать с ним и опубликовать дальнейшие комментарии.
Имейте в виду, что даже несмотря на то, что PCL является стандартом, его поддержка от производителя к производителю и от устройства к устройству может быть проблемой и сильно отличаться. При выполнении основных задач большинство устройств кажется нормальным; однако, если вы перейдете к макросам или сложной графике, вы обнаружите разницу.
Позиционирование было ошибкой вырезания и вставки (у вас тоже есть опечатка). Я решил забыть о вращении PCL и просто повернуть себя. Решил все мои проблемы. Здесь мы используем пару программ просмотра PCL, и ни одна из них не показала проблему, только сам принтер. Я все еще озадачен, но у меня есть рабочий код.