# Einzelne Pixel in einem Bild lesen



## keman (25. Jan 2007)

Hallo!

Ich hab ein kleines Java-Programm geschrieben, das jeden einzelnen Pixel eines Bildes herausliest und wiedergibt, so dass ein neues Bild entsteht. Beim lesen jedes einelnen Pixels kann ich bestimmte Bildeffekte einfügen, das simpleste Beispiel ist der schwarz-weiss-Effekt.
Das Programm funktioniert, jedoch ist getPixelColor() (jenen Teil hab ich aus einer Page kopiert) viel zu langsam, bei einem 100x100 Bild geht es ja noch, aber bei grösseren Bildern, auch nur 150x150 hat das Programm mehrere Minuten um jeden einzelnen Pixel zu lesen und neu zu zeichnen.

Meine Frage: Gibt es etwas schnelleres als dieser grausame Code, aus dem getPixelColor() besteht, oder ist das Lesen jedes einzelnen Pixels einer völlig gestörte Idee? (Bitte fragt nicht wieso ich nicht javax.media.jai oder sonstige spezifische Image-Bibliotheken verwende, um zu den Bildern effekte einzufügen  ).


```
// Hier wird das Bild ohne Veränderungen neugezeichnet
public Image createImage() {
BufferedImage bi = new BufferedImage(500, 500, BufferedImage.TYPE_INT_RGB);
Graphics g = bi.createGraphics();
for (int x = 0; x < image.getWidth(this); x++) {
for (int y = 0; y < image.getHeight(this); y++) {
Color nextColor = getPixelColor(image, x, y);
int new_r = nextColor.getRed();
int new_g = nextColor.getGreen();
int new_b = nextColor.getBlue();
Color newColor = new Color(new_r, new_g, new_b);
g.setColor(newColor);
g.drawLine(x, y, x, y);
}
}
return bi;
}

// Diesen Teil hab ich aus dem Internet kopiert, funktioniert aber problemlos
public Color getPixelColor(Image im, int x, int y) {
int[] pix = new int[1];
PixelGrabber pg = new PixelGrabber(im, x, y, 1, 1, pix, 0, 0);
try {
pg.grabPixels();
} catch (InterruptedException e) {
e.printStackTrace();
}
return new Color((pix[0] >> 16) & 0xff, (pix[0] >> 8) & 0xff,
(pix[0]) & 0xff);
}
```


----------



## FatFire (25. Jan 2007)

Wenn Du sowieso das Bild in einem BufferedImage hast, warum nutzt Du nicht gleich getRGB(int x, int y) und setRGB(int x, int y, int rgb) die einem das BufferedImage bietet? Ich bin mir nicht ganz sicher, ob das was Du vorhast damit möglich ist...aber beim groben Überfliegen wüßte ich jetzt auch nicht, was dagegen spricht  :wink:

P.S.: Nein, keine Sorge, das Lesen und Schreiben eines Bildes Pixel für Pixel ist keineswegs gestört.


----------



## keman (25. Jan 2007)

Wie verwendet man getRGB() verwenden  ?


Dies gibt nämlich ein schönes aber leider unbrauchbares komplett weisses Bild aus  :


```
int rgb = bi.getRGB(x, y);
Color nextColor = new Color(rgb);
```


----------



## EgonOlsen (25. Jan 2007)

www.java-forum.org/de/viewtopic.php?t=41832


----------



## FatFire (26. Jan 2007)

Hm, okay, wenn man das Thema schonmal durch hatte und weiß wo es steht, dann ist das natürlich noch besser (ich bin ja auch noch nicht so lange dabei)...aber wenigstens der Weg war der Richtige. Danke Egon.


----------



## Marco13 (26. Jan 2007)

Das langsame ist 1. die scheußliche Methode "getPixelColor" (für jeden Pixel wird dort ein Color-Objket erstellt) und 2. der scheußliche Rest. Dort wird nämlich NOCHMAL für jeden Pixel ein Color-Objekt erstellt (was nicht nur langsam, sondern auch überflüssig ist) und das Zeichnen einer Linie ist wesentlich aufwändiger, als das Setzen eines Pixels (auch wenn die Linie nur die Länge 1 hat)


----------

