Java Image Editor Imager v0.5

Imager ist ein kleines Java Image-Processing Tool. Es hat nicht den Anspruch ein komplettes Bildbearbeitungsprogramm zu sein, sondern ist viel mehr entstanden um verschiedene Algorythmen und Ideen in der digitalen Bildverarbeitung ausprobieren zu können. Imager ist über eine einfach gehaltene Plugin-Schnittstelle erweiterbar. Das Tool wird von mir je nach Zeit (und Lust) weiterentwickelt.



Neu in Versin 0.5
  • Zoom
  • Unterschiedliche Rendering-Typen
    (Nearest neighbour, bilinear, bicubic)
  • Histogramm

Was kann Imager nicht
  • Keine Auswahl von Teilbereichen (Plugins manipulieren das ganze Bild!)
  • Keine Zeichenfunktionen
  • Bilder (auch Graustufen) werden als Typ RGB behandelt
  • Transparenz wird nicht unterstützt
Java Image Editor




Download





Info

JAR-File (Windows, Linux, Mac):
Imager v0.5 (jar)
[Zip, 2.2Mb]

Installation

Zip-Archiv entpacken und
Imager.jar ausführen.
Mac-App:
Imager v0.5 (mac)
[Zip, 2.2Mb]

Installation

Zip-Archiv entpacken,
Imager App in den Application Order
verschieben oder einfach ausführen

Voraussetzung

Getestet
  • Windows 2000/XP/Vista, jre 1.6 (SE)
  • Mac OSX 10.4, 10.5 jre 1.4
  • Mac OSX 10.6.2 jre 1.5
Lizenz

GNU Public License v3




Plugin-Auswahl mit Beispielbildern


Pixelizer - Mosaik in drei Varianten

Referenz-Pixel:
Die RGB-Werte des ersten Pixels im Block werden für die Pixel des gesamten Blocks verwendet.
Durchschnitt:
Berechnung des durchschnittlichen RGB-Werts pro Block
Akkumulierter Durchschnitt:
Der Durchschnitt wird nicht aus einem Block ermittelt, sondern innerhalb eines Blocks bei jedem Pixel neu berechnet.
Java image editor pixelize Java image editor pixelize simple block Java image editor pixelize average Java image editor pixelize average
Farbe/Sättigung/Helligkeit (HSB)

Drehen des Farbkreises im HSB-Farbraum sowie verändern der Sättigung und Helligkeit
farbe sättigung helligkeit farbe sättigung helligkeit farbe sättigung helligkeit farbe sättigung helligkeit
Einfärben

Einfärben von Bildern in zwei Varianten:
  • Sättigungs- und Luminanzwerte des Ursprungsbildes erhalten
  • Farb- und Sättigungswerte mit Auswahlfarbe austauschen (Luminanzwerte werden erhalten)
Bereiche einfärben (experimentell!)
Falschfarben

Anhand veränderbarer RGB-Werte wird ein Lookup-Table (LUT) generiert und die Pixelwerte des Bildes ausgetauscht.
Gamma-Korrektur

Zum Vergleich erhöhte Helligkeit (letztes Bild).
Helligkeit/Kontrast

Verändern von Helligkeit und Kontrast (RGB).
Luminanz-Kontrast

Anders als beim Plugin Helligkeit/Kontrast wird nur der Kontrast der Luminanzwerte verändert. Die Farbwerte für rot, grün und blau bleiben erhalten.
Asciify - Textbilder

Bildinformation in ASCII-Zeichen umwandeln.

Einstellungen:
  • Textfarbe einfarbig oder entsprechend dem Ausgangsbild
  • Hintergrundfarbe oder Ausgangsbild
  • Schrift: Typ, Schnitt und Größe
  • Schrift: Antialiasing oder 'pixelig'
  • Blockgröße
  • X/Y-Offset (Verschieben)
  • Positiv / Negativ

Was noch fehlt:

Auswahl unterschiedlicher Zeichensätze (Codebooks), z. B.:
  • Nur Ziffern
  • Nur Sonderzeichen
  • Zeichensatz mit feinerer oder härterer Abstufung
  • Nur 0 und 1
  • ...




Konturen

Findet Konturen im Bild. Konturfarbe wählbar. Das Ausgangsbild kann als Hintergrund erhalten werden.
Schwellenwert (Threshold)

  • Veränderbare Farben für Pixel-Werte kleiner und größer als der Schwellenwert
  • Ausgangsbild kann eingebunden werden
Mirror Machine

ohne Worte!
Farbwerte extrahieren

Das Plugin extrahiert die Farbwerte eines Bildes. Die Luminanzwerte werden dabei verworfen, d. h. auf weiß gesetzt.
Bewegungsunschärfe (Motion Blur)

Noch auf horizontale Bewegungsunschärfe beschränkt. Der Winkel sollte veränderbar sein.
Farbreduktion

Einfache Form der Farbreduktion.
Dither Machine

Verschiedene Dither-Varienten. Momentan ist nur die Muster-Variante implementiert.

Einfache Fehlerdiffusion und Floyd-Steinberg sind aber so gut wie fertig.
Histogram

Für Luminanz und die Farbkanäle Rot Grün Blau. (Zum Vergleich das Histogram aus Photoshop)
Bilder Exportieren

Noch sehr einfach gehalten, damit Bilder überhaupt erst einmal gespeichert werden können.

Zum Speichern werden die Bibliotheken von ImageJ und Jimi verwendet.

Vorsicht: Existierende Bilder werden überschrieben! Es wird noch nicht nachgefragt!

Unterstützte Formate:
JPG, GIF, TIFF, PNG, BMP




 Plugin-Schnittstelle


Imager kennt zwei Typen von Plugins

PixelProcessor:
Übergabe der Pixelwerte sowie Höhe und Breite des Bildes.

public int[] process(int[] pixel, int w, int h);

BufferedImageProcessor
Übergabe des BufferedImage Objekts. Über das Graphics-Object kann so beispielsweise in das Bild gezeichnet werden (Auch Java-interne Affine Transformationen oder Kernel Operationen beruhen auf dem BufferedImage-Object).

public BufferedImage process(BufferedImage bim);

Compilieren und Einbinden von Plugins

Compilieren (java sdk notwendig!) z. B.:

javac -classpath Imager.jar Invert.java

(Vorausgesetzt Imager.jar und Invert.java liegen im selben Verzeichnis!)

Compilierte Class-Dateien in das Verzeichnis 'plugin' kopieren (oder in ein Unterverzeichnis - es können auch weitere Unterverzeichnisse angelegt werden).

Oder über eine IDE (z. B. Eclipse)...

In zukünfitigen Versionen ist die Unterstützung von Plugins in Form von gepackten JAR-Archiven angedacht!


Die hier aufgeführte Dokumentation ist etwas dürftig! Falls jemand wirklich Interesse hat und mehr Information haben möchte - bitte kontaktieren:

Plugin-Beispielcode: Inverter (PixelProcessor)

import de.js.imager.plugin.PixelProcessor;

public class Invert extends PixelProcessor
{

    public String getDescription()
    {
       return "Inverts an Image to its negative";
    }

    public String getRepresentationName()
    {
       return "Inverter";
    }

    public int[] process(int[] pixel, int w , int h)
    {
       int max = w * h;

       for (int pos = 0; pos < max; pos++)
       {
          int rgb = pixel[pos];
          pixel[pos] = (rgb & 0xff0000) | (~rgb & 0x00ffff);
       }
       return pixel;
    }

    public boolean showModalDialog()
    {
       return true;
    }

}