PCL растровая цветная графика искажена. Включенный код: что мне не хватает? - PullRequest
3 голосов
/ 21 ноября 2008

Приведенная ниже функция печатает цветное растровое изображение на принтере PCL-5. Эта функция была адаптирована на основе имеющейся у нас функции 2-цветной печати (1 bpp), которая отлично работала, за исключением зернистой 2-цветной печати. Проблема в том, что изображение выходит с большой черной полосой, простирающейся от правого края изображения до края страницы следующим образом:

  IMAGE#########################################
  IMAGE#########AREA COMPLETELY BLACK###########
  IMAGE#########################################

Само изображение выглядит идеально, в противном случае.

Различные инструменты PCL-to-PDF вообще не показывают изображение, что наводит меня на мысль, что я забыл что-то сделать. Соответствующие сбросы (\ u001bE \ u001b% -12345X) были отправлены до, а фиды после.

Есть ли эксперты PCL? У меня есть Техническое справочное руководство по цвету PCL 5, и оно дошло до меня. Хотя эта последняя вещь сводит меня с ума.

* Edit: Теперь я знаю, какая команда вызывает проблему, но я не знаю почему:

  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)
    }

1 Ответ

4 голосов
/ 22 ноября 2008

Есть несколько проблем с вашим кодом. Прежде всего, ваш код положения курсора неверный, он должен выглядеть так:

"\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 является стандартом, его поддержка от производителя к производителю и от устройства к устройству может быть проблемой и сильно отличаться. При выполнении основных задач большинство устройств кажутся в порядке; однако, если вы попадете в макрос или сложную графику, вы найдете разницу.

...