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 ).
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 ).
Code:
// 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);
}