# BufferedImage#setRGB #getRGB zu langsam



## tuxedo (15. Aug 2008)

Hi,

ich stehe gerade vor dem Problem, dass ein


```
myPixelBlock = myBufferedImage.getRGB(x, y, blockWidth, blockHeight, myPixelBlock , 0, blockWidth);
```

und 


```
myBufferedImage.setRGB(x,y,blockWidth,blockHeight,myPixelBlock ,0,blockWidth);
```

zu viel Zeit verschlingt.

Ich hab gelesen dass das mit dem Raster, das das BUfferedImage anbietet schneller gehen soll. Habs aber irgendie nicht hinbekommen. Folgendes wirft mir immer eine ArrayIndexOutOfBounds Exception


```
myPixelBlock = myBufferedImage.getRaster().getPixels(x, y, blockWidth, blockHeight, myPixelBlock );
```

X und Y sind valide Werte innerhalb des Bildes (1024x768 großes Bild). blockWidth und blockHeight haben fixe Werte von jeweils 5. Und myPixelBlock ist ein eindimensionales Array der Länge 25 (=5*5).

Hintergrund ist:

Ich hab ein Bild A und ein Bild B. Und mittels eines noch recht naiven Algorithmuses, will ich herausfinden, welche Stellen sich in Bild B von Bild A unterscheiden.

Dazu zerteile ich jeweils Bild A und B in gleichgröße Klötzchen (5x5 Pixel) und vergleiche die Klötzchen miteinander. Da ich aber sehr viele Folgebilder hab, muss das sehr oft geschehen. Und wenn dann getRGB() und setRGB als Spassbremse da stehen, geht dem Programm schnell die Puste aus.

Weiß jemand wie ich möglichst effizient Rechtecke aus einem Bild extrahieren kann damit ich solche Blöcke miteinander vergleichen kann (vergleichen geht zur Zeit deutlich schneller als das extrahieren)?

gruß
Alex


----------



## Ark (15. Aug 2008)

```
BufferedImage img=blubb();
int[] buf=((DataBufferInt)img.getRaster().getDataBuffer()).getBankData()[0];
```
Ob es sich um DataBufferInt oder andere DataBuffer handelt, hängt vom gewählten Farbmodell ab (also ob 24 Bit Farbe oder 16 Bit Farbe oder 1 Bit S/W usw.), beachte dazu einfach die Beschreibungen der Konstanten, die du beim Konstruktor eines BufferedImages benötigst. Auch die Verteilung, also in welchen Bits der ints welche Farben zu finden sind, ist da beschrieben (z.B. 888-RGB oder 565-RGB oder 888-BGR, so in der Art). Die Koordinaten sind, glaube ich, nach dem Muster buf[x+width*y] verteilt (zumindest bei 888-RGB, ich kann mich aber auch irren).

Ark


----------



## tuxedo (15. Aug 2008)

D.h. ich muss mir da dann mein Rechteckausschnitt wieder "aufwendig" aus dem eindimensionalen Array zusammensuchen?!

- Alex


----------



## Ark (15. Aug 2008)

alex0801 hat gesagt.:
			
		

> D.h. ich muss mir da dann mein Rechteckausschnitt wieder "aufwendig" aus dem eindimensionalen Array zusammensuchen?!


Das hast du ganz richtig erkannt. Nun kannst du direkt im Array vergleichen, ohne irgendwelche Methodenaufrufe, die neue Objekte nach sich ziehen, ertragen zu müssen. Wenn man sich dabei geschickt anstellt, sind auch nur wenige Multiplikationen (u.U. sogar keine einzige!) nötig, um die Ausschnitte zu vergleichen. Wenn man dann noch Aussagen über die stochastische Verteilung zur Hand hat, sollten die Berechnungen relativ fix gehen.

Ark


----------



## tuxedo (15. Aug 2008)

Okay, danke. Denke das bringt mich weiter.

- Alex


----------

