Domanda

La funzione seguente stampa un'immagine raster a colori su una stampante PCL-5. La funzione è stata adattata da una funzione di stampa a 2 colori (1bpp) che abbiamo funzionato perfettamente, ad eccezione della stampa a 2 colori sgranata. Il problema è che l'immagine viene visualizzata con una grande barra nera che si estende dalla destra dell'immagine fino al bordo della pagina in questo modo:

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

L'immagine stessa sembra perfetta, altrimenti.

Vari strumenti da PCL a PDF non mostrano affatto l'immagine, il che mi porta a credere di aver dimenticato di fare qualcosa. Ripristini appropriati (\ u001bE \ u001b% -12345X) sono stati inviati prima e i feed di pagina dopo.

Qualche esperto di PCL là fuori? Ho il manuale tecnico di riferimento a colori PCL 5 e mi è arrivato così lontano. Quest'ultima cosa mi sta facendo impazzire.

* Modifica: Ora so quale comando sta causando il problema, ma non so perché:

  stream("\u001b*r0F"); 

Questo dovrebbe mantenere l'immagine ruotata insieme alla pagina (verticale, orizzontale). Se lo rimuovo, il problema scompare. Posso compensare ruotando prima la bitmap, ma voglio davvero sapere cosa ha causato questo!

   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)
    }
È stato utile?

Soluzione

Ci sono alcuni problemi con il tuo codice. Prima di tutto il codice di posizione del cursore non è corretto, dovrebbe essere visualizzato:

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

Ciò equivale a:

<esc>*p1000x1000Y

hai avuto:

<esc>*p1000x*p1000Y

Quando si uniscono i comandi PCL si combina lo stesso valore e gruppo parametrizzati e quindi si aggiunge semplicemente valore + carattere parametrizzato + valore + carattere parametrizzato ecc. Assicurarsi che il carattere parametrizzato finale sia una lettera maiuscola che indica la fine del comando PCL .

Inoltre, quando si definisce un'immagine, ti consiglio di specificare anche la larghezza & amp; hight in decipoints, questo dovrebbe aiutare con il ridimensionamento dell'immagine (* r3A) sulla pagina, quindi aggiungi questo (subito dopo il tuo comando di risoluzione dovrebbe essere un posto adatto per esso):

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

L'altra raccomandazione è di scrivere tutto questo su un file (guarda le tue codifiche) e usare uno dei pochi visualizzatori PCL per visualizzare i tuoi dati invece di stamparli sempre. Dovrebbe farti risparmiare un po 'di tempo e una foresta o due! Li ho provati tutti e consiglio vivamente di spendere $ 89 e acquistare pclWorks . Hanno anche un SDK completo se hai intenzione di fare molto PCL. Non lo usiamo perché codifichiamo noi stessi tutti i PCL, ma sembra buono.

Per quanto riguarda la rotazione, abbiamo riscontrato dei problemi su alcuni dispositivi, potresti solo ruotare prima il jpg (original.RotateFlip) e poi scriverlo.

Oggi non ho molto tempo, ma spero che i miei commenti siano di aiuto. Posso testare il tuo codice lunedì o martedì, lavorare con esso e pubblicare ulteriori commenti.

Tieni presente che, sebbene PCL sia uno standard, il suo supporto da produttore a produttore e da dispositivo a dispositivo può essere un problema e molto diverso. Quando si eseguono operazioni di base, la maggior parte dei dispositivi sembra a posto; tuttavia, se entri nelle macro o nella grafica complessa, troverai la differenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top