Frage

Die Funktion unten druckt ein Farbrasterbild auf einem PCL-5 Drucker. Die Funktion wurde von einer 2-Farben (1bpp) Druckfunktion angepasst hatten wir das funktionierte perfekt, bis auf den körnigen 2-Farbdruck. Das Problem ist, dass das Bild mit einem großen schwarzen Balken kommt aus dem rechten Seite des Bildes an den Rande der Seite wie folgt erstreckt:

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

Das Bild selbst sieht perfekt aus, sonst.

Verschiedene PCL-to-PDF-Tools zeigen nicht das Bild überhaupt, was mich führt zu glauben, dass ich vergessen habe, etwas zu tun. Geeignete Resets (\ u001bE \ u001b% -12345X) wurden vor ausgesendet und Seite-Feeds nach.

Jede PCL-Experten da draußen? Ich habe die PCL 5 Farbe Technical Reference Manual bekam, und es ist mir so weit gekommen. Das letzte, was treibt obwohl ich verrückt.

* Edit: Ich weiß jetzt, was Befehl das Problem verursacht, aber ich weiß nicht, warum:

  stream("\u001b*r0F"); 

Dies sollte das Bild zusammen mit der Seite (Portrait, Landschaft) gedreht halten. Wenn ich diese entfernen, geht das Problem weg. Ich kann vorher durch Drehen des Bitmap kompensieren, aber ich möchte wirklich wissen, was dies verursacht!

   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)
    }
War es hilfreich?

Lösung

Es gibt ein paar Probleme mit Ihrem Code. First off Cursorposition Code falsch ist, sollte es lesen:

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

Dies entspricht:

<esc>*p1000x1000Y

Sie hatte:

<esc>*p1000x*p1000Y

Beim Verbinden PCL-Befehle zusammen passen Sie den gleichen parametrisierte Wert und Gruppe und dann einfach Wert + parametrisierte Zeichen + Wert + parametrisierte Zeichen usw. Stellen Sie sicher, dass die endgültige parametrisierte Zeichen ein Großbuchstabe, der das Ende des PCL-Befehl bedeutet .

Auch wenn ein Bild definieren, empfehle ich Ihnen, auch die Breite und Höhe in decipoints angeben, das mit der Skalierung des Bildes helfen soll (* R3A) auf der Seite dieses so hinzufügen (nur nach der Auflösung Befehl sollte eine Ordnung vorhanden sein, für sie):

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

Die andere Empfehlung ist dies alles zu schreiben (sehen Sie Ihre Codierungen) und einer der Handvoll von PCL Zuschauer verwenden, um Datei Ihre Daten sehen vs. Druck immer. Sollte sparen Sie Zeit und einen Wald oder zwei! Ich habe sie alle ausprobiert und Wold empfehlen verbringen die $ 89 und Einkauf PCLWorks . Sie haben auch ein komplettes SDK, wenn Sie eine Menge von PCL tun werden. Wir verwenden nicht, dass wir alle PCL selbst codieren, aber es gut aussieht.

Wie bei Rotation haben wir Probleme auf einigen Geräten haben, können Sie drehen gerade die das jpg ersten (original.RotateFlip) ein es dann schreiben.

Ich habe heute nicht viel Zeit, aber hoffe, dass meine Kommentare unterstützen. Ich kann Ihren Code am Montag oder Dienstag testen und mit ihr arbeiten und schreiben weitere Kommentare.

Beachten Sie, dass, obwohl PCL ist ein Standard der Unterstützung von Hersteller zu Hersteller und Gerät zu Gerät ein Problem, und ganz anders sein kann. Wenn grundlegende Dinge zu tun, die meisten Geräte scheinen in Ordnung; Wenn Sie jedoch in Makros oder komplexe Grafiken erhalten Sie Unterschied finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top