Die klassische Rasterpunktform in PostScript


1. Allgemeines zur Rasterung in PostScript

Für die Rasterung in PostScript sind drei Parameter bestimmend:

  1. Die Rasterfrequenz, z.B. mit RF bezeichnet. In PostScript in lpi (lines per inch) anzugeben. Für die Umrechnung gilt:
    RFlpi = RFL/cm* 2.54
  2. Der Rasterwinkel, z.B. mit RW bezeichnet. Wie in der früheren Reprotechnik üblich im Gradmaß anzugeben.
  3. Die Spotfunktion. Sie beschreibt die Rasterpunktform, z.B. nach der "klassischen Rasterpunktform". Die Spotfunktion ist als PostScript-Prozedur zu programmieren.

Die Rasterparameter werden mit dem Postscript-Operator setscreen gesetzt. Die Syntax:

    RF RW { s p o t f u n k t i o n } setscreen

Die Spotfunktion berechnet mit den x/y-Koordinaten des Raster-Einheitsquadrates die z-Koordindate des Rasterberges. Sie ist so zu normieren, dass an allen Stellen des Einheitsquadrates (x, y = -1.0 ... 0.0 ... +1.0) die z-Werte innerhalb der Grenzen -1.0 und +1.0 liegen. Ein Über- oder Unterschreiten führt zu einem fatalen "Aufhängen" des PostScript-RIPs (Raster Image Processor). Der z-Wertebereich von -1.0 bis +1.0 braucht nicht ausgeschöpft zu werden; üblicherweise normiert man aber auf den maximal möglichen Bereich oder auf den Bereich 0.0 ... 1.0.

Den Rasterberg muß man sich als dreidimensionales Gebilde vorstellen. Zu Veranschaulichung soll eine Pyramide über dem Raster-Einheitsquadrat und der Höhe 1 dienen. Beim "Füllen" des Rasterpunktes mit dem PostScript-Operator fill (siehe späteres PostScript-Programm "Rpm90-Kl.PS") stelle man sich eine Höhenschnitt durch die Pyramide vor, der so gelegt ist, dass die Größe der Schnittfläche den gewünschten Flächendeckungsgrad entspricht. Die Schnittfläche hat bei der Pyramide verständlicherweise eine quadratische Gestalt; man erhält also immer quadratische Rasterpunkte. Legt man den Schnitt durch die Spitze der Pyramide, ist die Größe der Schnittfläche null und somit auch der Flächendeckungsgrad. Beim Schnitt durch die Basis der Pyramide beträgt der Flächendeckungsgrad 1 bzw. 100%. Mit der Pyramide als Rasterberg erhält man also quadratische Rasterpunkte die erst bei 100% zum Punktschluß kommen. Diese Punktform ist alles andere als optimal!

Verwendet man als Rasterberg einen Kreiskegel, erhält man kreisförmige Rasterpunkte. Man kann leicht zeigen, dass diese Kreispunkte bei einem Flächendeckungsgrad von 78.5% (Genauwert Pi/4*100%, Pi = 3.141593) zum Punktschluß kommen. Bis dahin erhält man freistehende Kreispunkte, die für sich optimal sind. Nach dem Punktschluß entstehen aber Negativpunkte in Kissenform mit extremen Spitzen, die nur mit großen Tonwertverlusten zu übertragen sind. Somit sind Kreispunkte nicht über den gesamten Tonwertbereich ideal.

Die Programmierung einer PostScript-Spotfunktion besteht darin, zuerst den qewünschten Rasterberg mathematisch zu formulieren (meistens der schwierigere Teil) und dann in PostScript umzusetzen.

Es sei drauf hingewiesen, dass die tatsächliche Füllung der Rasterzelle mit Pixeln technisch etwas anders abläuft als die eben beschriebene analoge Vorstellung mit den Höhenschnitten durch den Rasterberg. Für die Entwicklung von PostScript-Spotfunktionen ist die analoge Vorstellung aber sehr hilfreich.

2. Der Rasterberg für die klassischen Rasterpunktform

Bei diesem Rasterberg ist zwischen einem positiven Teil (z >= 0) und einem negativen Teil (z < 0) zu unterscheiden. Der positive Teil gilt für den Bereich

    |x| + |y| <= 1

Dieser Bereich entspricht dem Inneren eines auf die Spitze gestellten Quadrates innerhalb des Einheitsquadrates, siehe Grafik. Der Rasterberg läßt sich dann wie folgt beschreiben:

    (1)   z = (y² - 1 - x²>)² - 4 x²
Einheitsquadrat

Herleitung: In der vorstehenden Grafik sind die vier Geraden g1, g2, g3 und g4 eingezeichnet. Die Gleichungen der Geraden in expliziter Form (links) und impliziter Form (rechts):

    g1:  y =  1 + x     ==>    y - 1 - x = 0
    g2:  y =  1 - x     ==>    y - 1 + x = 0
    g3:  y = -1 + x     ==>    y + 1 - x = 0
    g4:  y = -1 - x     ==>    y + 1 + x = 0

Man erhält die Funktion z = f(x, y) wenn man die vier Geradengleichungen in impliziter Form multipliziert und das Produkt gleich z setzt. Also:

    (y - 1 - x) * (y - 1 + x) * (y + 1 - x) * (y + 1 + x) = z

Nach wenigen Zwischenrechnungen erhält man die gewünschte Funktion für den positiven Teil des Rasterberges nach Gleichung (1):

Außerhalb des bisher behandelten Bereiches, d.h. in den vier Ecken des Einheitsquadrates sind folgende Transformationen vorzunehmen:

    x --> 1 - |x|
    y --> 1 - |y|
    z --> 1 - z

Im folgenden PostScript Programm ist eine Spotfunktion nach diesen Vorgaben enthalten. Der z-Wert wird dort mit der Unterprozedur "Rpm-Klassisch" berechnet.

Für ein allgemeingültiges Rasterpunktmodell mit beliebigen kissen- und tonnenförmigen freistehenden Punkten und Kettenpunkten sind im obigen Ansatz die Geraden durch geeignete gekrümmte Linien zu ersetzen, z.B. durch Hyperbeln. Der mathematische Aufwand für die Beschreibung eines allgemeinen Rasterberges ist aber enorm und im allgemeinen Rasterpunktmodell "Rpm90" umgesetzt. Das "Rpm90" enthält als Spezialfälle auch die klassische und die optimale Rasterpunktform.

Anmerkung: Für die klassische Rasterpunktform existieren auch noch trigonometrische Lösungen, die fast identische Punktformen liefern. Sie lauten mit der Kreiszahl:

      Pi = 3,141593
(2)   z = [cos(x*Pi) + cos(y*Pi)] / 2

Es ist darüber hinaus auch noch folgende Variante (3) bekannt, die aber über eine trigonometrische Umformung in (2) übergeführt werden kann, also mit ihr identisch ist:

(3)   z =  cos[(x-y)*Pi/2] * cos[(x+y)*Pi/2)]

Die Umsetzung der Cosinus-Varianten in PostScript ist einfach, da PostScript die Cosinusfunktion "cos" besitzt, man also keine Approximation dafür entwickeln muß und auch keine Fallunterscheidung vorgenommen werden muß. Allerdings kann man mit den Cosinus-Varianten kein allgemeines Rasterpunktmodell im Sinne des "Rpm90" entwickeln. Auch Sonderformen wie z.B. Hexagonalraster sind mit diesen Ansätzen nicht möglich.

Bei der Programmierung der Spotfunktion hat man davon auszugehen, dass die x/y-Werte der normierten Rasterzelle bereits auf dem Stackspeicher liegen (y auf Stackspitze, x darunter). Am Ende der Spotfunktion muß der Spotfunktionswert (z-Wert des Rasterberges) auf der Stackspitze liegen; der x- und der y-Wert müssen dagegen "verbraucht" sein, dürfen also nicht mehr im Stack sein.

Die folgende Grafik zeigt links den Rasterberg für die klassische Rasterpunktform nach Gleichung (1) und rechts den Rasterberg für die Cosinus-Variante nach Gleichung (2).
Rpm-2.jpg

Obwohl die mathematischen Beschreibungen der Rasterberge völlig verschieden aussehen, führen die Höhenschnitte mit gleichen Flächendeckungsgraden zu praktisch identischen Rasterpunktformen, so dass man auch der Cosinus-Variante eine klassische Rasterpunktform unterstellen kann.

3. Ein PostScript-Programm für eine Testform mit der klassische Rasterpunktform

Das Programm erzeugt eine Testform mit 16 * 16 = 256 Rasterfeldern mit allen 256 Tonwertstufen. Papierweiß ist darin nicht enthalten. Die Rasterfelder haben eine Größe von 9 * 9 mm, bei einem Abstand von 1 mm.

Vorab: Kommentare werden in PostScript-Programmen mit dem Prozentzeichen % eingeleitet und gelten für den ganzen Zeilenrest.

%!PS-Adobe 2.0   ==============================================================
% PostScript-Datei "Rpm90-kl.PS"
% 100 Rasterfelder mit Tonwerten 1 bis 100% drucken. Dr. Karl Haller, 30.6.1999

/RF-Lcm 3 def  % Rasterfrequenz (Rasterlinienzahl, Rasterfeinheit, Rasterweite)
               % in L/cm. Fuer Demo z.B. 10 L/cm, ggf. aendern
/RW 0 def      % Rasterwinkel in Grad,            ggf. aendern
%---------- Ab hier nichts mehr aendern ---------------------------------------
/RF RF-Lcm 2.54 mul def    % Umrechnung Rasterfrequenz in lpi (lines per inch)

RF RW { /zRpm-Klassisch                         % PostScript-Spotfunktion fuer
         { dup mul exch dup mul dup 4 mul       % die klassische Rasterpunkform
           3 1 roll sub 1 sub dup mul exch sub  % Nicht optimal, da vierfacher
         } def                                  % Punktschluss mit grossem
        abs exch abs exch 2 copy add 1 le       % Tonwertsprung.
         { zRpm-Klassisch     }                 % Besser: Optimale Rasterpunkt-
         { 1 sub abs exch 1 sub abs exch        % form nach "Rpm90" mit einem
           zRpm-Klassisch neg } ifelse          % Kettenbereich von 15%.
      } setscreen                               % Dr. K. Haller
%------------------------------------------------------------------------------
/mm { 72 25.4 div mul } def  % Umrechnung mm in Punkte (1 Punkt = 1 Pt = 1/72")
/x0  30  mm   def   % Nullpunkt x0 von links unten
/y0 220  mm   def   % Nullpunkt y0 von links unten

/k   10  mm   def   % Kantenlaenge der Rasterfelder
/dx   3  mm   def   % Abstand zwischen den Rasterfeldern in x-Richtung
/dy   5  mm   def
/DX  k dx add def   % Abstand der Rasterfelder in x-Richtung
/DY  k dy add def

/Str 10 string def  % Allgemeine String-Variable

/Helvetica findfont 20 scalefont setfont
x0 y0 20 mm add moveto (Klassische Rasterpunktform in PostScript)  show
/Helvetica findfont 10  scalefont setfont
x0 y0 16 mm add moveto (Besser: Optimale Rasterpunktform nach )    show
                       ("Rpm90" mit 15% Kettenbereich. kha)        show
x0 y0 10 mm add moveto (Rasterfrequenz: ) show
RF-Lcm Str cvs show ( L/cm) show ( = )    show
RF Str cvs show ( lpi)      show
x0 y0  6.5 mm add moveto (Rasterwinkel: ) show
RW     Str cvs show (\312)                show
x0 y0 45 mm add moveto (Fachhochschule Muenchen, )          show
(Studiengang Druck- und Medientechnik, Prof. Dr. K. Haller) show
x0 y0 40 mm add moveto (PostScript-Datei "Rpm90-kl.PS")     show
/Helvetica findfont 6  scalefont setfont
%------------------------------------------------------------------------------
/iMax 10 def
1 1 iMax { /iy exch def   % "Laufvariable" von Stackspitze auf Variable "iy"
           /y y0 iy 1 sub DY mul sub def
           1 1 iMax { /ix exch def   % "Laufvariable" auf "ix"

                      /x x0 ix 1 sub DX mul add def

                      /Phi iy 1 sub iMax mul ix add iMax iMax mul div def
                      x y 0.5 mm add moveto
                      Phi 100 mul cvi Str cvs show (%) show

                      x y moveto          % Rahmen zeichnen
                      0.1 mm setlinewidth
                      k 0 rlineto 0 k neg rlineto k neg 0 rlineto
                      closepath stroke

                      x y moveto          % Rasterfeld zeichnen
                      k 0 rlineto 0 k neg rlineto k neg 0 rlineto
                      closepath 1 Phi sub setgray fill

                      0 setgray
                    } for  % Ende ix-Schleife
         } for             % Ende iy-Schleife

x0 y0 iMax DY mul sub moveto  % Volltonbalken zeichnen
iMax DX mul dx sub 0     rlineto
0 k neg                  rlineto
iMax DX mul dx sub neg 0 rlineto
closepath 0 setgray fill
showpage %========= EoF =======================================================

Anmerkungen zum PostScript-Programm: Es könnte sein, daß die Definition einer eigenen Spotfunktion von der RIP-Software (Raster Image Processor) unterbunden wird, da manche Hersteller von Film- und Plattenbelichtern nur ihre Spotfunktion oder eine eigene Implementation des Rasterberges einsetzen wollen, um Spielereien des Anwenders zu unterbinden. Aus Gründen der sicheren Produktion hat man dafür Verständnis; für den Ausbildungsbetrieb ist diese (früher nicht übliche) Gängelung hinderlich. Auf Laserdruckern mit PostScript-Option, wie z.B. bei vielen Modellen der HP-LaserJet-Serie, können eigene Spotfunktionen benutzt werden. Zur Demo kann man die Rasterfrequenz im Programm noch weiter heruntersetzen, um große anschauliche Rasterpunkte erhalten; der Speicher des Druckers setzt aber Grenzen. Man teste!

Es sei noch darauf hingewiesen, dass mit GostScript oder Gost ein ausgezeichneter Freeware-PostScript-Emulator zur Verfügung steht, mit dem auch viele Nicht-PostScript-Drucker bedient werden können. Mit GostScript ist auch eine Bildschirmausgabe möglich, was bei der Entwicklung von PostScript-Programmen sehr nützlich ist.

15.03.1999, Prof. Dr.-Ing. Karl Haller, Fachhochschule München, Studiengang Druck- und Medientechnik

Zurück