Zum Menü springen Zum Inhalt springen

iamBlog

Java: Bildbearbeitung

01.11 2008 20:48

Bildbearbeitung

In der neuen Java Aufgabe müssen wir eine Methode der vorgegebenen Klasse erweitern, so dass man die gegebenen Bilder (rifer.gif und farbenkreis_b.gif) z. B. in Grauwertbilder umwandeln kann.

Vorbereitungen

Zuerst legen wir ein neues Java-Projekt an und kopieren die zwei Bilder in den Projektordner:

Speicherort

Die vorgegebene Java-Datei wird nun in den "src-Ordner" kopiert. Nach diesen paar Kopiervorgängen aktualisiert man in Eclipse den Package-Explorer (mit F5) und schon erscheinen die zwei Bilder und die Java-Datei.

Farbenlehre

In dieser Aufgabe müssen wir Farbinformationen aus den vorgegebenen Bildern manipulieren. Dies soll alles in der Methode filterRGB der Klasse TestFilter passieren.

filterRGB bekommt bei jedem Aufruf die Farbinformation eines Pixels als Integer-Wert (Variable: pixel) übergeben und soll den veränderten Farbwert in der Variable filteredPixel zurückgeben.

Dies geht einfach, wenn wir die Farbinformationen mit der &-Operation (Bitweises und) verknüpfen.

Also FARBE & FILTER = ERGEBNIS.

Wie geht das?

Der &-Operator vergleicht jedes Bit zweier Bitfolgen und setzt eine "1", wenn beide Bitfolgen an der gleichen Stelle eine "1" haben - und eine "0" wenn dies nicht zutrifft.

Filter (Ein int-Wert hat 32 Bit. Hier soll nur gezeigt werden, wie der &-Operator arbeitet!)

Den Filter schreiben wir in Hexadezimaler Schreibweise:

z. B.: 0xff112233 (Jede "Ziffer" entspricht 4 Bits - int-Zahl hat 32 Bits => 8 "Ziffern" lang)

Die ersten 8 Bits, also "ff" (von links) entsprechen dem Alpha-Wert, also der Transparenz der Farbe.

Die nächsten 8 Bits ("11") repräsentieren den Rot-Anteil der Farbe.

Die vorletzten 8 Bits ("22") repräsentieren den Grün-Anteil der Farbe.

Die letzten 8 Bits ("33") repräsentieren den Blau-Anteil der Farbe.

Jeder dieser Farbanteile hat 8 Bits und kann somit Werte zwischen 0 und 255 (dezimal) oder 00 und ff (hexadezimal) annehmen.

Mit diesem Hintergrundwissen können wir uns nun an die Aufgaben wagen ;)

Farben filtern

Um die entsprechenden Farben aus dem Bild zu filtern, müssen wir lediglich unseren Filter anpassen!

Rot:

Der rote Farbanteil wird in den zweiten 8 Bits gespeichert. Setzen wir diese nun auf "0", da wir diese Farbe im Ergebnis nicht haben wollen. Die restlichen Bits müssen natürlich auf "1" stehen, da diese Farben ja erhalten bleiben sollen.

in Hex-Schreibweise sieht unser Filter dann so aus: 0xff00ffff


filteredPixel = (pixel & 0xff00ffff)

Grün & Blau:

Wenn wir die Grün oder Blauanteile aus dem Bild entfernen wollen, müssen wir statt der roten - die grüne oder blaue Farbinformation beim Filter "auf 0 setzen".

Bild anmalen

Wollen wir jedem Pixel des Bildes die gleiche Farbe verpassen, so weisen wir einfach filteredPixel eine bestimmte Farbe zu! Dies können wir mit einem Hexadezimalen Wert oder mit einem Int-Wert (negativ!) machen.


filteredPixel = (0xff4e56ac)

filteredPixel = -234234

Farbanteile vertauschen

Um bei einem Bild die Farbanteile vertauschen zu können, müssen wir die Farbanteile auslesen und anschließend vertauscht wieder zuweisen.

Hier wird r der rote, g der grüne und b der blaue Farbwert zugewiesen:


        int r = ((pixel & 0xff0000) >> 16);
        int g = ((pixel & 0xff00) >> 8);
        int b = (pixel & 0xff);

Rot muss um 16 Bits nach rechts verschoben werden, damit wir eine int-Zahl erhalten, die zwischen 0 und 255 ist. Grün muss um 8 Bits verschoben werden. Blau muss nicht verschoben werden, da es ja sowieso ganz rechts steht.

Um nun z. B. Rot und Blau zu vertauschen muss man nun die Grün wieder 8 Bits nach links und die Blau um 16 Bits nach links verschieben. Die Rot muss nicht verschoben werden, da sie schon an der "blauen-Position" ist!

Diese Farbinformationen werden mit dem |-Operator (Bitweises oder) verknüpft. Ist ein Bit von A oder von B "1", wird "1" zurückgeliefert. Speicherort


filteredPixel = (pixel & 0xff000000) | b << 16 | g << 8 | r

Hell oder Dunkel

Um herauszufinden, ob eine Farbe hell oder dunkel ist, brauchen wir ihren Grauwert. (Mittelwert aus r, g und b) Ist dieser Wert über oder unter einem gewissen Schwellenwert, so wird die Farbe des Pixels behalten oder durch Schwarz/Weiß ersetzt.

Hier die Vorgehensweise bei der Darstellung von hellen Bildteilen:


int c = (r + g + b) / 3;
if(c > 127){
    filteredPixel = (0xffffffff);
} else {
    filteredPixel = pixel;
}

Aufhellen

Um ein Bild aufzuhellen müssen nur alle Farbwerte mit einem gewissen Faktor ( > 1) multipliziert werden. Allerdings sollte man beachten, dass der entstandene Wert die 255 nicht überschreitet!

Hier die Aufhellung des blauen Bildanteils:


 b *= 1.5;

if(b > 255){
    b = 255;
}

filteredPixel = (pixel & 0xff000000) | r << 16 | g << 8 | b;

Graue Bilder

Ein Grauwertbild erhält man, in dem man den Mittelwert aller Farbwerte jeder Farbinformation zuweist.


int c = (r + g + b) / 3;
filteredPixel = (pixel & 0xff000000) | c << 16 | c << 8 | c;

Um das Bild Schwarz/Weiß darzustellen müssen wir wie bei der Darstellung der hellen und dunklen Bildteile vorgehen. Also einen Schwellenwert festlegen (> 0 und < 255) und überprüfen ob der Mittelwert der aktuellen Pixelfarbe größer oder kleiner dem Schwellenwert ist. Je nach dem wird das Bild schwarz (0xff000000) oder weiß (0xffffffff) angemalt.

Kommentare

  1. Noch keine Kommentare vorhanden.
  2. Dieser Eintrag kann nicht mehr kommentiert werden.

Nächster Eintrag: Java IAM 3: GUI

Vorheriger Eintrag: Java: kleiner Taschenrechner

Über den iamBlog

Der iamBlog ist von und für Studenten der FH Augsburg und alle Leute die sich für Design, Medien und Multimedia interessieren.

Namensgebend war der Studiengang InterAktive Medien an der FH Augsburg.

Der Blog befindet sich Moment noch im Aufbau. Wir entschuldigen uns für eventuell fehlende Funktionen und den ein oder anderen Fehler im System.

Die neuesten Links

Kategorien

Das neueste Design

Avant von pichfl

Zum Auswählen eines Designs einfach oben links auf den Button Hintergrund ändern klicken.

Feeds

Die Einträge im Blog lassen sich als Atom-Feed abonnieren. Außerdem gibt es einen kombinierten Atom-Feed, der Blogeinträge und Links enthält.
Diese Feeds werden z.B. von Browsern wie Safari oder Mozilla Firefox, Newsreadern wie NetNewsWire oder Feadreader oder Onlinediensten wie Google Reader unterstützt und werden automatisch aktualisiert, wenn neue Einträge im iamBlog vorhanden sind.

Werbung

Disclaimer

This page will never work with Internet Explorer. If you use Internet Explorer to view this page, all styles and features are deactivated. Use Firefox, Safari or Opera to see all the beautiful colours of the internet.