2D-Grafik Schnelles ändern von Pixelfarbe in BufferedImages

VGLink

Mitglied
Hallo alle zusammen,

ich suche nach einer Möglichkeit die Farben in einem BufferedImage schnell zu ändern. Hab was gesurft und code beispiele gefunden, nur waren diese sehr langsam und es kommt zum laggen des Bildes.

Die Idee kommt daher, das ich eine TagNacht Zyklus darstellen möchte und dazu das Bild nehme und die Farben der Tageszeit anpasse. Hab diesen Code momentan drinne aber der ist was lahm:

Java:
    public void run() {
        while (this.frame.isVisible()) {
            if (this.frame.getBild() != null) {
                BufferedImage img = this.frame.getBild();

                LUT lut = new LUT();
                RGBColor color = new RGBColor();

                lut.setA(0.5);
                for (int x = 0, w = img.getWidth(); x < w; x++) {
                    for (int y = 0, h = img.getHeight(); y < h; y++) {
                        int rgb = img.getRGB(x, y);
                        color.setColor(rgb);

                        color.setRGB(lut.getLUTValue(color.getRed()),
                                lut.getLUTValue(color.getGreen()),
                                lut.getLUTValue(color.getBlue()));

                        img.setRGB(x, y, color.getRGB());
                    }
                }

            }
            try {
                Thread.sleep(10);
            } catch (Exception en) {
            }
        }
    }

    public class RGBColor {

        private int farbe;

        public RGBColor() {
        }

        public void setColor(int rgb) {
            farbe = rgb;
        }

        public int getRed() {
            return (farbe >> 16) & 0xFF;
        }

        public int getGreen() {
            return (farbe >> 8) & 0xFF;
        }

        public int getBlue() {
            return (farbe >> 0) & 0xFF;
        }

        public void setRGB(int r, int g, int b) {
            farbe = ((255 & 0xFF) << 24) | ((r & 0xFF) << 16) | ((g & 0xFF) << 8) | ((b & 0xFF) << 0);
        }

        public int getRGB() {
            return farbe;
        }
    }

    public class LUT {

        private int[] value;
        private double a = 1;
        private double b = 0;

        public LUT() {
            value = new int[256];
            create();
        }

        public int getLUTValue(int x) {
            return value[x];
        }

        public void setA(double a) {
            this.a = a;
            create();
        }

        public void setB(double b) {
            this.b = b;
            create();
        }

        private void create() {
            for (int x = 0; x <= 255; x++) {
                value[x] = (int) (a * x + b);

                if (value[x] > 255) {
                    value[x] = 255;
                }

                if (value[x] < 0) {
                    value[x] = 0;
                }
            }
        }
    }

Bin für Vorschläge dankbar 😀
 
Bei einen Tag/Nachtzyklus wird es ja eigendlich einfach nur heller und dünkler. Könntest du da nicht einfach das GlassPane schwarz machen und einfach dessen Transparenz ändern?

Sonst könntest du die Bilder (je nach Größe) auch vorbereiten.
 
Danke erstmal für die Antwort. GlassPane? Naja wenn du den Sonnenuntergang oder aufgang darstellen möchtest ,muss man ja auch alles etwas rötlicher darstellen. Hab versucht die Bilder nach dem einlesen und vor dem Zeichnen zu ändern , aber die werden alle nur Schwarz.
 
Ein GlassPanel braucht man wohl nicht. Wenn es wirklich um ein gleichmäßiges Einfärben geht, könnte man einfach mit
Java:
@Override
protected void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.drawImage(image);
 
    g.setColor(128,64,64,32); // Ziemlich transparenter rötlicher ton...
    g.fillRecht(0,0,getWidth(),getHeight());
}
einen Rotton über das ganze Bild pinseln.

Komplexeres Einfärben wäre auch möglich. Für den Sonnenuntergang würde man einen RadialGradientPaint setzen, an der Sonnenposition gelb und nach außen hin rötlich.

Wenn das nicht reicht und wirklich das Bild geändert werden soll, könnte man sich auch da noch überlegen, ob man das erreichen kann, indem man entsprechend ins Graphics reinpinselt, das man vom BufferedImage bekommen kann. Die einzelnen Pixel zu ändern ist immer etwas aufwändiger, aber auch das könnte man schneller machen. Siehe http://www.java-forum.org/spiele-mu...xel-bufferedimage-bearbeiten-performance.html . Alles wiederholt sich. ....
 
Hey. Danke, muss jetzt nur noch schauen wie ich die Color so setzten kann das das richtige rauskommt.

Denke das dürfte gehen wenn nicht meld ich mich nochmal. Werde damit mal was rumspielen 😀

Danke 😀
 

Neue Themen


Zurück
Oben