Gráficos de color de trama PCL distorsionados. Código incluido: ¿qué me estoy perdiendo?

StackOverflow https://stackoverflow.com/questions/309150

Pregunta

La siguiente función imprime una imagen de trama de color en una impresora PCL-5. La función se adaptó de una función de impresión de 2 colores (1 ppp) que teníamos que funcionó perfectamente, excepto por la impresión granulada de 2 colores. El problema es que la imagen sale con una barra negra grande que se extiende desde la derecha de la imagen hasta el borde de la página de esta manera:

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

La imagen en sí se ve perfecta, de lo contrario.

Varias herramientas de PCL a PDF no muestran la imagen en absoluto, lo que me lleva a creer que he olvidado hacer algo. Los reinicios apropiados (\ u001bE \ u001b% -12345X) se enviaron antes y los feeds de página después.

¿Algún experto en PCL? Tengo el Manual de referencia técnica de color PCL 5, y me ha llevado hasta aquí. Sin embargo, esto último me está volviendo loco.

* Editar: Ahora sé qué comando está causando el problema, pero no sé por qué:

  stream("\u001b*r0F"); 

Esto debería mantener la imagen rotada junto con la página (vertical, horizontal). Si elimino esto, el problema desaparece. Puedo compensar girando el mapa de bits de antemano, ¡pero realmente quiero saber qué causó esto!

   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)
    }
¿Fue útil?

Solución

Hay algunos problemas con su código. Primero, el código de posición del cursor es incorrecto, debería leer:

"\u001b*p{0:d}x1:d}Y", 1000, 1000

Esto equivale a:

<esc>*p1000x1000Y

tenías:

<esc>*p1000x*p1000Y

Al unir los comandos PCL, debe hacer coincidir el mismo valor y grupo parametrizados y luego simplemente agregar valor + carácter parametrizado + valor + carácter parametrizado, etc. Asegúrese de que el carácter parametrizado final sea una letra mayúscula que signifique el final del comando PCL .

También al definir una imagen, le recomiendo que también especifique el ancho & amp; en decimales, esto debería ayudar con la escala de la imagen (* r3A) en la página, así que agregue esto (justo después de que su comando de resolución debería ser un lugar adecuado para ello):

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

La otra recomendación es escribir todo esto en el archivo (ver sus codificaciones) y usar uno de los pocos visores PCL para ver sus datos en lugar de imprimirlos siempre. ¡Debería ahorrarte algo de tiempo y un bosque o dos! Los probé todos y recomiendo gastar $ 89 y comprar pclWorks . También tienen un SDK completo si vas a hacer mucha PCL. No usamos eso ya que codificamos todos los PCL nosotros mismos, pero se ve bien.

En cuanto a la rotación, hemos tenido problemas en algunos dispositivos. Puede rotar primero el jpg (original.RotateFlip) y luego escribirlo.

No tengo mucho tiempo hoy, pero espero que mis comentarios ayuden. Puedo probar su código el lunes o martes y trabajar con él y publicar cualquier comentario adicional.

Tenga en cuenta que aunque PCL es un estándar, su soporte de fabricante a fabricante y de dispositivo a dispositivo puede ser un problema y muy diferente. Al hacer cosas básicas, la mayoría de los dispositivos parecen estar bien; sin embargo, si se mete en macros o gráficos complejos, encontrará la diferencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top