2017-02-07 3 views
2

Ich entwickle eine Anwendung, die ein Bild über die Erzeugung von PostScript-Ausgabe druckt und es an den Drucker sendet. Also konvertiere ich mein Bild in jpg, dann in den ASCII85-String, füge diese Daten an die Postscript-Datei an und sende sie an den Drucker.Beschleunigung Postscript-Bild Drucken

Ausgabe wie folgt aussieht:

%! 
{/DeviceRGB setcolorspace 
/T currentfile/ASCII85Decode filter def 
/F T/DCTDecode filter def 
<</ImageType 1/Width 3600/Height 2400/BitsPerComponent 
8/ImageMatrix[7.809 0 0 -8.053 0 2400]/Decode 
[0 1 0 1 0 1]/DataSource F>> image F closefile T closefile} 
exec 
s4IA0!"_al8O`[\!<E1.!+5d,s5<tI7<iNY!!#_f!%IsK!!iQ0!?(qA!!!!"!!!".!?2"B!!!!"!!! 
--------------------------------------------------------------- 
ASCII85 data 
--------------------------------------------------------------- 
bSKs4I~> 
showpage 

jetzt Mein Ziel diesen Code zu beschleunigen ist. Jetzt dauert es etwa 14 Sekunden, bis der Drucker die Seite (für die 2-MB-Datei) druckt.

Warum ist es so langsam?

Vielleicht kann ich das Bild neu formatieren, so dass der Drucker keine affine Transformation des Bildes durchführen muss?

Vielleicht kann ich bessere Bildcodierung verwenden?

Alle Tutorials, Hinweise oder Ratschläge wären wertvoll.

Antwort

3

Ein Grund ist langsam, weil JPEG ein teures Kompressionsfilter ist. Versuchen Sie stattdessen, Flate zu verwenden. Kodieren Sie das Bild nicht mit ASCII85, senden Sie es als Binärdatei, das reduziert die Übertragungszeit und entfernt einen weiteren Filter. Beachten Sie, dass jpeg eine verlustbehaftete Komprimierung ist. Wenn Sie also "in JPEG konvertieren", geben Sie auch die Qualität auf.

Sie können reduzieren die die Menge an Aufwand der Drucker geht durch Erstellen/Skalieren des Bildes (vor dem Erstellen der PostScript), so dass jedes Bild Beispiel entspricht ein Pixel im Gerät Raum. Wenn Sie dagegen ein Bild skalieren, müssen Sie mehr Bilddaten an den Drucker senden. Aber heutzutage ist die Datenverbindung in der Regel schnell.

Dies ist jedoch in der Regel schwer zu bewerkstelligen und wird häufig dadurch zunichte gemacht, dass der Drucker möglicherweise nicht an den Rand des Mediums drucken kann und daher die Markierungsvorgänge um einen kleinen Betrag skalieren kann, sodass der Inhalt passt auf dem bedruckbaren Bereich. Es ist normalerweise ziemlich schwer herauszufinden, ob das so ist.

Ihre ImageMatrix ist, naja, komisch ..... Es ist keine 1: 1 Skalierung und Gleitkomma-Skalierungsfaktoren werden das Mapping von Userspace auf Geräteraum wirklich verlangsamen. Und Sie haben viele Proben zu kartieren.

Sie könnten die Bildbeispiele auch in PostScript-Geräteraum abbilden (so dass links unten bei 0,0 statt oben links ist), was bedeuten würde, dass Sie die CTM nicht in der y-Achse spiegeln müssten.

Kurz gesagt, ist der Versuch, mit den Skalierungsfaktoren zu spielen, wahrscheinlich nicht wert, und die meisten Drucker optimieren diese Transformationen trotzdem.

Das Farbmodell des Druckers ist normalerweise CMYK. Wenn Sie also ein RGB-Bild senden, erzwingen Sie eine Farbkonvertierung des Druckers für jede Probe im Bild. Für Ihr Image sind mehr als 8,5 Millionen Conversions erforderlich.

+0

Vielen Dank für Ihre Ratschläge! Mein Bild ist 3600x2400 und die Seitenauflösung ist 3600x2400 (6x4 Zoll, 600 dpi), aber PostScript verwendet 1/72 Zoll Einheiten, also, wie ich von [diesem] (http://stackoverflow.com/a/17716915/4974495) Antwort, ich sollte immer noch nicht 1: 1 Skalierung in CTM verwenden. Liege ich falsch? Kann man das vermeiden? – AndrewR

+0

PostScript-Einheiten sind tatsächlich 1/72 Zoll, so dass Skalierungsfaktoren schwer zu berechnen sind. Sie haben die Auflösung des Geräts in Ihrer Frage nicht erwähnt, daher konnte ich nicht sagen, ob die Skalierung 1: 1 sein würde oder nicht. – KenS