Palette aus Bild extrahieren

  • Themenstarter Themenstarter Gast
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Heyho,
wisst ihr wie man aus einem Bild die RGB-Palette herausbekommt? Lässt man for-Schleifen darüber laufen und in ArrayList die Pixel abspeichern, dauert das zu lange. Die Bilder sind sehr groß! Rechenzeiten > 15 Sekunden.

Grüße
 
Ich habe eine halbwegs zufriedenstellende Lösung gefunden. Immerhin habe ich die Zeit auf weniger als eine halbe Sekunde reduzieren können. getRawMap() liefert ein einfaches BufferedImage mit reingezeichnetem png-Bild.
Gibt es noch andere Möglichkeiten?

Code:
           long t1 = System.currentTimeMillis();            
            Integer integer;
            byte [] pixelsB = ((DataBufferByte) this.getTileMap().getRawMap().getRaster().getDataBuffer()).getData();
            int  [] pixelsI = new int[pixelsB.length];
            
            for (int i = 0; i < pixelsB.length; i++) {
                pixelsI[i] = ((Byte) pixelsB[i]).intValue();
                integer = pixelsI[i];
                this.colorList.add(integer);
            }   
            this.colorList = new ArrayList<Integer>(new LinkedHashSet<Integer>(colorList));   /* löscht multiple Einträge */
            
            System.out.println(this.colorList.size());
            integer = null;
            pixelsB = null;
            pixelsI = null;
            System.out.println("RGB's zählen: Verarbeitungszeit: " + (System.currentTimeMillis() - t1) + " ms");
 
Der zuvor gepostete Code klappt doch nicht. Ich bekomme byte-Werte, die sich nicht in new Color(...) einsetzen lassen.
Wenn ich allerdings anstelle
Code:
byte [] pixelsB = ((DataBufferByte) this.getTileMap().getRawMap().getRaster().getDataBuffer()).getData();
die int-Variante wähle, schmeißt dir mir exception:
Code:
int [] pixels = ((DataBufferInt) this.getTileMap().getRawMap().getRaster().getDataBuffer()).getData();

Code:
Exception in thread "Thread-2" java.lang.ClassCastException: java.awt.image.DataBufferByte

Eigentlich sollte das Casten doch funktionieren ???:L
 
Es wäre gut, wenn man wüßte, welchen Typ das BufferedImage hat. Im Idealfall sollte der Typ bekannt sein. Wenn es ein BufferedImage.TYPE_INT_RGB ist, könnte man sich dann mit getDataEelments direkt die Pixel holen. VIELLEICHT wäre es auch effizienter, diese Pixel dann direkt in eine HashSet einzufügen, statt erst eine riiiiiesige Liste zu erstellen, und am Ende die doppelten zu löschen.
Code:
            long t1 = System.currentTimeMillis();            
            int pixels[] = this.getTileMap().getRawMap().getRaster().getDataElements(0,0,widht,height,null);
            HashSet<Integer> pixelSet = new HashSet<Integer>();
            for (int i = 0; i < pixels.length; i++) {
                pixelSet.add(pixels[i]);
            }   
            this.colorList = new ArrayList<Integer>(pixelSet);
            
            System.out.println(this.colorList.size());
            System.out.println("RGB's zählen: Verarbeitungszeit: " + (System.currentTimeMillis() - t1) + " ms");
 
Der Typ des BufImg ist TYPE_INT_ARGB.
Die Verkürzung mit dem HashSet habe ich realisiert und macht natürlich Sinn. Statt
Code:
getRaster().getDataElement
habe ich
Code:
getRGB(0, 0, w, h, pixels, 0, w)
. Geschwindigkeiten beider werde ich noch testen. Wobei ich nicht glaube, dass diese sich sehr stark unterscheiden werden.

Danke dir für die Hilfe 🙂
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben