filetype jar

Transcription

filetype jar
Dokumentation zur Semesterarbeit bei Dr. Klaus Simon, ETH Zürich
(Department Informatik) und EMPA St. Gallen (Abteilung Medientechnik)
Manual zur
Halftoning
Application
Autor: Tobias Schlatter, September 2001
Betreuer: Beat Trachsler
1. Einleitung
Ein Ziel meiner Semesterarbeit war es, ein eigenes Halftoning-Verfahren zu entwickeln, bei
dem die Rasterpunkte unter Berücksichtigung der Nachbarschaft eines Pixels stochastisch
verteilt werden. Das Problem dabei war, dass es keine Software gab, mit der man eigene Halftoning-Verfahren programmieren, implementieren und visualisieren konnte.
Daher sollte im Vorfeld des eigenen Verfahrens eine Applikation entstehen, worin man eigene
Halftoning-Verfahren möglichst einfach als Plug-Ins einbinden und visualisieren kann. So
kann man direkt das Resultat grafisch beurteilen, ohne sich um die Darstellung der Bilder
oder das Laden und Speichern der Bilder kümmern zu müssen.
Entstanden ist nun ein Programm, das im Internet herunterladbar und frei benutzbar ist. Es ist
bei folgender Adresse zu finden:
http://www.educeth.ch/informatik/vortraege/grafikformate/halftoning/
Es werden mehrere Möglichkeiten angeboten, wie man das Programm starten kann:
-
Das Programm kann als Java-Applet direkt im Browser gestartet werden. Dazu müssen ein Java 2 Plug-In für Version 1.3 (oder höher) und ein Java Advanced Imaging
(JAI) Package (Version 1.01 oder höher) installiert werden (siehe auch Abschnitt
„Häufige Fragen“). Sind beide Tools installiert, so wird auf der Webseite eine Taste
gezeigt, mit der man das Halftoning Applet starten kann. Das Halftoning Applet hat
gegenüber der Halftoning Application den Nachteil, dass weder eigene Bilder noch eigene Raster-Algorithmen geladen, noch die gerasterten Bilder gespeichert werden
können.
-
Um das Programm als Java-Applikation zu starten und später eigene Rasterverfahren
zu programmieren, benötigt man ein Java 2 Software Development Kit (Java 2 SDK)
Version 1.3 (oder höher). Dazu auch noch das Java Advanced Imaging (JAI) Package,
Version 1.01 oder höher (siehe auch Abschnitt mit häufigen Fragen). Sind beide Tools
richtig installiert, so kann die Halftoning Application mit einem Doppelklick auf
„halftoneapplet.jar“ gestartet werden. Alternativ kann das Programm auch über java
–jar halftoneapplet von einer MS-DOS-Eingabeaufforderung gestartet werden.
Das hat den Vorteil, dass man Fehlermeldungen angezeigt bekommt, was sehr nützlich ist beim Programmieren eigener Raster-Algorithmen.
-
Das Programm kann auch mit Hilfe des Quellcodes kompiliert und gestartet werden.
Diese Option sollte aber nur von Java-Profis benutzt werden. Dazu später mehr.
Ist die Applikation oder das Applet erfolgreich gestartet, so hat man schon eine grosse Hürde
überwunden. Falls Probleme bei der Installation der Packages und Plug-Ins auftreten, empfiehlt es sich, die Tipps im Abschnitt „Häufige Fragen“ durchzulesen.
2. Der Aufbau der Halftoning Application
Originalbilder
Gerasterte
Bilder
Graukeil
Auswählbares Bild
Optionen / Infos
Obige Abbildung zeigt den Aufbau des Programms. Auf der rechten Seite befindet sich ein
Bereich mit Informationen und einstellbaren Optionen, der sich je nach ausgewähltem Rasterungsverfahren unterschiedlich präsentiert. Bei Programmstart werden Bilder und RasterungsAlgorithmen gesucht und eingebunden (ausser wenn als Applet gestartet). Als Bilder kommen
entweder Graustufenbilder oder Farbbilder (RGB) in Frage, und zwar in den Dateiformaten
TIFF (*.tif) und JPEG (*.jpg).
Folgende Rasterungsalgorithmen sind fest implementiert:
-
Threshold Rasterung
-
Random Threshold Rasterung
-
Bayer Dither
-
Dispersed Dot Ordered Dither
-
Error Diffusion Rasterung
Mit dem Knopf „Berechne Rasterbild” wird sowohl der Graukeil als auch das auswählbare
Bild mit den eingestellten Optionen (sofern vorhanden) gerastert und in der unteren Hälfte
dargestellt. Jetzt können die Bilder gezoomt und bei Bedarf auch gespeichert werden (ausser
wenn das Programm als Applet läuft).
Wie ist die Halftoning-Application strukturiert?
In der Einleitung wurde bereits erwähnt, dass die Applikation darauf konzipiert ist, dem Programmierer des Rasterungs-Algorithmus möglichst viel Arbeit abzunehmen. Er soll sich
möglichst nur um sein Rasterungsverfahren kümmern müssen.
In der Benutzeroberfläche wird ein Rasterungsverfahren ausgewählt und dessen Optionen
eingestellt. Der Umgang mit verschiedenen Bildformaten, mit der Darstellung und dem Zoom
der Bilder übernimmt ein übergeordnetes Programmpaket, das über eine Schnittstelle mit dem
ausgewählten Halftoning-Verfahren kommuniziert.
Untenstehendes Schema soll das Prinzip verdeutlichen:
Grafische Benutzer-Schnittstelle (Halftoning Application)
Halftoning-Schnittstelle
Bild 1
Bild 2
...
Bild n
Threshold
Random Threshold
Bayer Dither
Floyd-Steinberg
...
Weitere Algorithmen
Die verschiedenen Algorithmen bilden kleine Module, die für sich kompiliert werden. Sie
werden beim Start zusammen mit den zur Verfügung stehenden Bildern eingelesen. Einige
Bilder und einige Algorithmen-Module sind im Programm bereits mitgeliefert. Weitere Bilder
und Algorithmen können im aktuellen Verzeichnis bereitgelegt werden. Die Applikation
nimmt diese dann automatisch mit ins Programm, sofern sie als gültige Module bzw. Bilder
erkannt werden.
Bekannte Fehler, Bedienungshinweise:
In gewissen Fällen kommt es vor, dass die Originalbilder verschwinden oder die Bilder ständig neu gezeichnet werden. Das ist ein Problem von Java, das einfach vergisst die Bilder neu
zu zeichnen. Verändern Sie in diesem Fall die Fenstergrösse des Programms oder laden Sie
das Bild nochmals neu. Dann funktioniert alles wieder ganz normal.
Das Programm kann nur mit RGB-Bildern und Graustufenbildern umgehen. Bilder in anderen
Farbmodellen (CMYK, Lab, XYZ, etc.) führen zu fehlerhaften Resultate, teilweise sogar zu
Programmabstürzen. Wandeln Sie ihr Bild in Photoshop (oder einem ähnlichen Programm) in
ein RGB-Bild und lassen Sie es danach von der Halftoning Application rastern. Die Dimension des Bildes sollte 450*300 Pixel nicht überschreiten, da es sonst nicht vollständig im
Fenster sichtbar ist.
3. Die Rasterungs-Algorithmen
Die eingebauten Rasterungs-Algorithmen wiederspiegeln eine Auswahl von gängigen
Rasterungsverfahren. Nachfolgend werden sie kurz erklärt. Tiefere Einblicke in die verschiedenen Verfahren bieten die Bücher von R. Ulichney [1], H. R. Kang [2] und D. L. Lau / G. R.
Arce [5]. Alle Algorithmen sind für Graustufenbilder konzipiert. Bei Farbbildern behandeln
sie jeden Farbkanal getrennt, ohne Einfluss auf die anderen Farbkanäle des gleichen Bildpunktes.
Threshold Rasterung
Das Threshold Verfahren weist jedem Grauwert eines Pixels entweder schwarz oder weiss zu.
Dabei bedient es sich eines fixen Schwellenwertes. Ist die Graustufe kleiner als der Schwellenwert, so wird der Punkt schwarz gefärbt, ansonsten weiss.
Random Threshold Rasterung
Dieser Algorithmus verwendet den Grauwert eines Bildpunktes als Wahrscheinlichkeit, dass
dieser Bildpunkt im gerasterten Bild weiss erscheint. Weisse Pixel ergeben also mit 100%
Wahrscheinlichkeit einen weissen Punkt, ein 50%-Grau ergibt zu 50% einen weissen Rasterpunkt.
Bayer Dither
Das Bayer Dither Verfahren stammt von B. E. Bayer von 1973 [4]. Es beruht auf einer
Threshold-Matrix, die für jeden Rasterpunkt den Grauwert verwaltet, ab dem dieser Punkt
weiss dargestellt wird.
Dispersed Dot Ordered Dither
Das Dispersed Dot Ordered Dither Verfahren funktioniert genau gleich wie das Bayer Dither
Verfahren. Unterschiedlich ist lediglich, wie man zu der Threshold-Matrix kommt. Die hier
verwendeten Matrizen werden mittels einem Tesselations-Verfahren rekursiv hergestellt. Je
nach Rekursionstiefe entstehen grössere Matrizen, d.h. es werden mehr Graustufen simuliert.
Error Diffusion Rasterung
Die Kategorie „Error Diffusion“ vereint mehrere Rasterverfahren, die sich alle des gleichen
Prinzips bedienen. Ein Bildpunkt wird wie im Threshold Verfahren gemäss einem Schwellenwert schwarz oder weiss gerastert. Der Fehler, der dabei gemacht wird, wird auf die umliegenden, noch nicht gerasterten Punkte verteilt. Die Verteilung bestimmt eine Matrix, die unterschiedlich gross sein kann. Diese Matrix kann auch dynamisch verändert (perturbiert) werden, was eine bessere Rasterbild-Qualität ergibt (siehe „Blue Noise“ in [1]).
4. Eigene Rasterungs-Algorithmen programmieren
Um ein eigenes Rasterungsverfahren zu implementieren, benötigt man die Dateien halftoneapplet.jar und vorlagen.zip, welche man von der Homepage herunterladen kann. Am besten
erstellt man sich einen neuen Ordner, worin man die Zip-Datei entpackt und das Jar-File hineinlegt. In diesem Ordner sollten jetzt 5 Dateien sein (3 Java-Dateien, ein TIFF-Bild und das
Jar-File).
Natürlich benötigt man auch noch das in der Einleitung angesprochene Java 2 Software Development Kit (Java 2 SDK) Version 1.3 (oder höher). Programmiert wird der Algorithmus
also in Java. Sie können einen gewöhnlichen Editor verwenden, um die Algorithmen zu programmieren. Ich empfehle den Freeware-Editor JCreator LE [6], da er angenehm zu bedienen
und doch recht einfach zu handhaben ist.
Es gibt 2 Möglichkeiten, wie man einen eigenen Raster-Algorithmus programmieren und
testen kann: Entweder mit oder ohne Grafische Benutzeroberfläche (Graphical User Interface
= GUI). Die Programmierung ohne GUI hat den Vorteil, dass man keine Bilder auswählen
oder Tasten betätigen muss. Das Programm startet und macht danach alles selbständig. Das
GUI hat dafür den Vorteil, dass man das Resultat gerade sieht. Zudem kann man nur per GUI
allfällige Optionen testen.
Am besten erstellt man sich eine Kopie von Halftone_Vorlage.java und gibt der Datei einen
sinnvollen Namen (in der Form „Halftone_MeinAlgorithmusName.java“). Die Namenskonvention ist äussert wichtig, damit der Algorithmus vom GUI automatisch gefunden werden
kann.
Öffnen Sie die Datei mit dem Editor und ändern Sie in den Zeilen 28, 29, 35, 59 und 67 den
Ausdruck „Halftone_Vorlage“ durch den von Ihnen gewählten Namen (z.B. „Halftone_MeinAlgorithmusName“). Die ersten drei Orte sind theoretisch nicht unbedingt nötig, aber es entspricht gutem Programmierstil. Ändern Sie jetzt in Zeile 81 den Namen des Algorithmus wie
er im Programm erscheint.
Programmierung ohne GUI (stand-alone)
Um die Rasterverfahren-Klasse später kompilieren zu
können, müssen Sie einige Dinge kontrollieren. Die
Package-Anweisung (Zeile 43) muss auskommentiert
und somit inaktiv sein. Sie wird nur gebraucht, wenn der
Algorithmus ins Jar-File gepackt werden soll.
In Zeile 48 muss die Import-Anweisung ebenfalls inaktiv
gesetzt werden. Sie verhindert, dass das GUI importiert
wird.
Nach dem Speichern der Datei ist Ihre Klasse jetzt bereits lauffähig. Sie macht zwar das gleiche wie die Vorlage, doch sollte der von Ihnen gewählte Namen erscheinen. Testen Sie dies,
indem sie die Klasse kompilieren und ausführen. Dazu öffnen Sie eine MS-DOS-Eingabeaufforderung, wechseln ins richtige Verzeichnis und tippen Zeile 28 ab (z.B. javac Halftone_MeinAlgorithmusName.java). Das erste Mal werden Sie eventuell eine Warnung
bekommen (weil die neu
erzeugte
HalftoneSuperClass ein API benutzt,
das als „deprecated“ vorgemerkt ist). Sie können
Sich jetzt überzeugen,
dass 2 neue „.class“-Da-
teien erzeugt worden sind. Jetzt können Sie die Zeile 29 abtippen (z.B. java Halftone_MeinAlgorithmusName) und der Algorithmus wird gestartet.
Wenn diese Schritte erfolgreich durchgeführt wurden, können Sie sich an Ihren Algorithmus
machen. Dazu brauchen Sie die Methode halftone, die Sie abändern müssen. Sie erhalten in
dieser Methode einen 3-dimensionalen int-Array (mit den Dimensionen Höhe, Breite und
Anzahl Farbenebenen) als Input und müssen einen solchen Array wieder zurückgeben. Der
Wert 255 entspricht weiss, 0 entspricht schwarz.
Programmierung mit GUI
Wie bei der stand-alone Version müssen Sie auch hier
einige Dinge kontrollieren. Die Package-Anweisung
(Zeile 43) muss auskommentiert und somit inaktiv sein.
Sie wird nur gebraucht, wenn der Algorithmus ins JarFile gepackt werden soll.
In Zeile 48 muss die Import-Anweisung aktiviert werden.
Wenn dort Kommentarzeichen vor der Zeile stehen, dann
löschen Sie sie.
Wiederum nach
dem Speichern
sollte die Klasse
nun
lauffähig
sein. Um sie zu
kompilieren und
zu starten benötigen Sie die Anweisungen
auf
Zeilen 35 und 36.
Nach dem Kompilieren sollte die
„.class“-Datei
Ihres Algorithmus erstellt worden sein. Nach dem Starten öffnet sich ein neues Fenster mit der Programmoberfläche.
Wenn dies alles geklappt hat, können Sie sich an das Programmieren Ihres Algorithmus wagen. Sie müssen die Methode halftone verändern.
Bei der Programmierung mittels GUI haben Sie die Möglichkeit, Optionen und Infos zum
Algorithmus anzubieten. Diese beiden Features sollten Sie aber erst implementieren, wenn
Ihr Algorithmus in den Grundzügen läuft. Dort müssen Sie alle Ereignisse selber abfangen
und handhaben. Sehen Sie sich dazu die erweiterte Vorlage („Halftone_ErweiterteVorlage.java“) an.
5. Der Source-Code der Halftoning-Application
Um den Source-Code zu betrachten, müssen Sie die Datei
halftoneproject.zip herunterladen. Den Source-Code werden
Sie in den allermeisten Fällen aber gar nie brauchen. Nur wenn
Sie das Programm erweitern möchten, oder die eingebauten
Algorithmen anschauen möchten, ist das sinnvoll. Wenn Sie
die heruntergeladene Datei entpacken, erstellt sich nebenstehende Verzeichnisstruktur.
Das Verzeichnis applet dient dazu, ein verändertes Jar-File mit
einem Browser zu testen.
Im Verzeichnis applikation können Sie testen, ob ein verändertes Jar-File auch als startbares Paket funktioniert.
Der Ordner project beinhaltet die eigentlichen Source-Code-Dateien. Da die Dateien als
Package definiert sind, entstehen Ordnerhierarchien mit 3 Ebenen. Bei classes finden Sie eine
Batch-Datei, die Ihnen aus den Klassendateien und aus den Bildern das Jar-File schnürt. Vergessen Sie nicht, dass Sie die Klassen erst einmal kompilieren müssen, bevor das klappt. Und
vergessen Sie auch nicht, die Jar-Datei in die Ordner applet/classes und application zu kopieren, um sie zu testen.
Mit dem JCreator können Sie direkt das ganze Projekt anschauen, wenn Sie die Datei HalftoneApplet.jcw doppelklicken. Sie können danach das ganze Projekt mit F7 kompilieren. Haben Sie JCreator nicht installiert, so starten Sie folgendes Kommando aus dem project-Verzeichnis in einer MS-DOS-Eingabeaufforderung:
javac -d classes ch/empa/halftoneapplet/AppletStart.java
Das garantiert Ihnen, dass die kompilierten Dateien am richtigen Ort landen.
Beachten Sie, wenn Sie Änderungen in HalftoneSuperClass.java machen, dass Sie diese Änderungen auch in der gleichen Datei im applikation Verzeichnis machen. Dort müssen Sie
aber die package-Anweisung mittels Kommentarzeichen deaktivieren.
Häufige Fragen / Tipps
Installationstipps
- Java 2 Software Development Kit (Java 2 SDK): Das ist das eigentliche „Java“. Sie
finden es unter http://java.sun.com/j2se/. Bei der Installation wird das Java Plug-In
(JRE) mitinstalliert – ob man will oder nicht. Die Installation sollte aber keinerlei
Probleme bereiten.
Testen Sie nach dem Download, ob sich z.B. die Halftone-Vorlage oder die HalftoneSuperClass kompilieren lassen. Beides sollte nun möglich sein.
-
Java Plug-In für Browser: Wird auch Java 2 Runtime Environment (JRE) genannt. Da
die gängigen Browser nur Java Applets bis Java 1 Version 1.1 darstellen können,
braucht man ein zusätzliches Browser-Plug-In. Zu finden ist es unter
http://java.sun.com/products/plugin/index.html. Laden Sie die internationale Version
des JRE herunter. Nach der Installation müssen alle Browserfenster geschlossen und
der Browser neu gestartet werden, damit das Applet korrekt läuft.
-
Java Advanced Imaging (JAI): Bei http://java.sun.com/products/java-media/jai/ kann
man JAI herunterladen. Wählen Sie den „JDK Install“ Download. Die Installationsroutine kopiert eigentlich nur 3 Dateien in die Java-Installation.
Es kann leider vereinzelt Fälle geben, wo das Installationsprogramm die 3 Dateien
nicht in alle notwendigen Verzeichnisse kopiert. Das tritt vor allem bei Personen auf,
die mehrere Java-Versionen gleichzeitig installiert haben. Dann müssen Sie die 3
Dateien jai_codec.jar, jai_core.jar, mlibwrapper_jai.jar selber ins Verzeichnis lib/ext
(Unterordner ext im Ordner lib) in allen Versionen ihrer Java-Installationen kopieren.
Danach sollten Applet bzw. Applikation laufen.
Falsche Java-Version
Wenn Sie bereits eine andere Version des Java 2 SDK oder des JRE installiert haben, kann es
sein, dass im Browser die falsche Version geladen wird. Um das zu überprüfen, wählen Sie
Start - Ausführen... und starten mit regedit den Registrierungs-Editor. Dort suchen Sie den
Schlüssel HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft. Die beiden Unterschlüssel Java
Development Kit (wenn Sie Java 2 SDK installiert haben) und Java Runtime Environment (für
die JRE-Installation) haben je einen Eintrag CurrentVersion. Der Wert, der diesem Eintrag
zugewiesen ist, sollte die neuste installierte Version sein, also z.B. „1.3“.
Für jede installierte Version sollte es einen Unterschlüssel geben, der als Namen die Versionsnummer trägt. Stimmt der Wert von CurrentVersion nicht mit der neusten Version überein, dann müssen Sie die Zeichenfolge ändern. Mittels Doppelklick können die Einträge bearbeitet werden.
Da die Werte aus der Registrierungs-Datenbank von Windows normalerweise nur beim Starten gelesen werden, müssen Sie den Computer danach neu starten.
Rasterungs-Algorithmus kann nicht kompiliert werden
Wenn Sie beim Programmieren Ihres Rasterungsverfahren Fehlermeldungen der nachfolgenden Art erhalten, dann wird es daran liegen, dass die import-Anweisung aktiv statt inaktiv ist
oder umgekehrt.
Wenn Sie für stand-alone kompilieren, muss die import-Anweisung (Zeile 48) inaktiv sein.
Haben Sie die import-Anweisung aktiv, dann sieht die Fehlermeldung folgendermassen aus:
Setzen Sie daher die import-Anweisung mit Kommentarzeichen ausser Kraft.
Kompilieren Sie Ihr Rasterungs-Algorithmus für das GUI, dann darf die import-Anweisung
von ch.empa.halftoneapplet.HalftoneSuperClass (Zeile 48) nicht deaktiviert sein. Ist die
import-Anweisung inaktiv, so ergibt sich folgende Fehlermeldung:
Entfernen Sie die Kommentarzeichen deshalb, damit der Import des GUI aktiviert wird.
Literaturhinweise
[1] Ulichney, Robert (1987): „Digital Halftoning“ Cambridge: MIT Press.
[2] Kang, Henry R. (1999): „Digital Color Halftoning“ Bellingham, Washington: SPIE
Optical Engineering Press.
[3] Gooran, Sasan (2001): „High Quality Frequency Modulated Halftoning” Dissertation,
Norrköping: Linköpings Universitet.
[4] Bayer, B. E. (1973): „An Optimum Method For Two-Level Rendition Of ContinousTone Pictures“ In: International Conference on Communications, Vol. 1, S. „26-11“ „26-15“
[5] Lau, Daniel L und Arce, Gonzalo R. (2001): „Modern Digital Halftoning“ New York,
Basel: Marcel Dekker, Inc.
[6] Java-Entwicklungsumgebung „JCreator LE version 2.0“: http://www.jcreator.com
JApplet
ActionListener
AppletStart
FilenameFilter
ShowOnlyPictureFiles
+accept(dir:File,name:String):boolean
+init():void
+stop():void
+actionPerformed(e:ActionEvent):void
+main(s:String[]):void
FilenameFilter
ShowOnlyClassFiles
+accept(dir:File,name:String):boolean
FileFilter
PictureFileFilter
PictureListManager
+PictureListManager(localFileList:String[],packageFileList:String[])
+PictureFileFilter()
+PictureFileFilter(extension:String)
vector:Vector
+PictureFileFilter(extension:String,description:String)
+PictureFileFilter(filters:String[])
+PictureFileFilter(filters:String[],description:String)
PictureListElement
+accept(f:File):boolean
+getExtension(f:File):String
+addExtension(extension:String):void
+PictureListElement(elementPictureName:String,elementFileName:Object,elemen
extensions:String[]
description:String
extensionListInDescription:boolean
GrayScaleRamp
pictureName:String
fileName:Object
fileType:int
packageFile:boolean
localFile:boolean
JFrame
+createGrayScaleRamp(width:int,height:int):int[]
BuildGuiFrame
Icon
+BuildGuiFrame(halftoneClassListValue:Vector,pictureListLocal:String[],pictureListInPackage:String[],isAppletValue:boolean)
IconJAI
+IconJAI(im:RenderedImage)
+paintIcon(c:Component,g:Graphics,x:int,y:int):void
HalftoneSuperClass
iconWidth:int
iconHeight:int
selectionRectangle:Rectangle
+halftone(pixelmap:int[][][]):int[][][]
+optionsPanel(numberOfBands:int):JPanel
+infoPanel():JPanel
+test(loadFileName:String,halftoneAlgorithm:HalftoneSuperClass,saveFileName:String,saveFileType:String):void
name:String
Halftone ErrorDiffusion
Halftone Threshold
Halftone RandomThreshold
+main(argv:String[]):void
+main(argv:String[]):void
+main(argv:String[]):void
+halftone(pixelmap:int[][][]):int[][][]
+halftone(pixelmap:int[][][]):int[][][]
+halftone(pixelmap:int[][][]):int[][][]
+inBounds(x:int,y:int,x_max:int,y_max:int):boolean
+optionsPanel(numberOfBands:int):JPanel
+infoPanel():JPanel
+dontOverflow(value:double):int
+changeThresholdValueRed():void
+perturbingMatrix(matrix:double[][],rand:Random):double[][]
+changeThresholdValueGreen():void
name:String
+lookUpAlgorithm():double[][]
+changeThresholdValueBlue():void
+lookUpMatrix():int[][]
+changeThresholdRGB(value:int):void
+lookUpDenominator():int
+infoPanel():JPanel
+lookUpPerturbation():int[][][]
+optionsPanel(numberOfBands:int):JPanel
name:String
+infoPanel():JPanel
+formatNumbers(val:int,max:int):String
+showMatrixInInfoPanel():void
name:String
Halftone Bayer
...DispersedDotOrderedDither
+main(argv:String[]):void
+main(argv:String[]):void
+halftone(pixelmap:int[][][]):int[][][]
+halftone(pixelmap:int[][][]):int[][][]
+lookUpBayerMatrix(value:int,x:int,y:int):int
+lookUpBayerMatrix(value:int,x:int,y:int):int
+optionsPanel(numberOfBands:int):JPanel
+optionsPanel(numberOfBands:int):JPanel
+infoPanel():JPanel
+infoPanel():JPanel
+formatNumbers(val:int,max:int):String +formatNumbers(val:int,max:int):String
+showMatrixInInfoPanel():void
+showMatrixInInfoPanel():void
name:String
name:String