# Palette aus Bild extrahieren



## Gast (21. Sep 2008)

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


----------



## Marco13 (21. Sep 2008)

Poste mal, wie du es bisher hast.


----------



## Gast (22. Sep 2008)

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?


```
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");
```


----------



## Guest (23. Sep 2008)

Der zuvor gepostete Code klappt doch nicht. Ich bekomme byte-Werte, die sich nicht in new Color(...) einsetzen lassen.
Wenn ich allerdings anstelle

```
byte [] pixelsB = ((DataBufferByte) this.getTileMap().getRawMap().getRaster().getDataBuffer()).getData();
```
die int-Variante wähle, schmeißt dir mir exception:

```
int [] pixels = ((DataBufferInt) this.getTileMap().getRawMap().getRaster().getDataBuffer()).getData();
```


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

Eigentlich sollte das Casten doch funktionieren  ???:L


----------



## Marco13 (23. Sep 2008)

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.

```
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");
```


----------



## Gast (23. Sep 2008)

Der Typ des BufImg ist TYPE_INT_ARGB.
Die Verkürzung mit dem HashSet habe ich realisiert und macht natürlich Sinn. Statt 
	
	
	
	





```
getRaster().getDataElement
```
 habe ich 
	
	
	
	





```
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


----------

