# 2 dim. Pixel Array in AWT?



## Guest (29. Apr 2005)

folgendes problem:

ich will in awt grafiken zeichnen und diese animieren.
am besten wäre es wenn ich jedes einzelne Pixel ansprechen und in farbe und pos. verändern könnte

gibt es irgendeine möglichkeit ein "Pixel"array zu bekommen?


----------



## christian8287 (3. Mai 2005)

Hi!

Das geht mit der Klasse PixelGrabber. Ich habe das auch schon mal gebraucht hier ein bsp. code:


```
private int[][] getArray(Image img, int width,int height) {
        
        int []array=new int[littleImage.getIconWidth()*littleImage.getIconHeight()]; // littleImage ist ein ImageIcon
        PixelGrabber grab = new PixelGrabber(img,0,0,width,height,array,0,width); // img ist das Image von littleImage - mittels littleImage.getImage()
        try {
            grab.grabPixels();        // Pixel in variable array schreiben
        }
        catch(InterruptedException e) {}
        int[][] a=new int[width][height]; 
        for(int y=0;y<height;y++)                 // in zweidimensionales array umwandeln
            for(int x=0;x<width;x++) 
                a[x][y]=array[y*width+x];
        return a;
    }
```


Ich hoffe ich konnte dir helfen.

mfg,
Christian.


----------



## DarKestSun (8. Mai 2005)

kann ich den pixel grabber auch benutzen wenn ich mit threads arbeite?
also performance mäßig gesehen
ich arbeite an nem jump n run spiel, da sollte der nich zu viel resourcen verbrauchen...


----------



## christian8287 (9. Mai 2005)

So weit ich das weiß, dürfte das kein Problem sein, ob du mit Threads arbeitest oder nicht.

mfg,
Christian.


----------



## Hansdampf (9. Mai 2005)

Am besten doppelt implementieren:  PixelGrabber/ImageSource  für Rechner mit Java <1.2, bei >1.2 komplett auf BufferedImage setzten.
Wenn man sowas nicht inner Schleife verwendet, genügt auch nur Pixelgrabber.
Schreib dir mal ein kurzes Testprogramm, es gibt garstige Geschwindigkeitsunterschiede.
Lass das mit den Threads, es geht besser ohne.


----------



## christian8287 (9. Mai 2005)

Also das mit dem BufferedImage hab ich nicht gewusst, dass man damit auch Pixel verändern kann. Kennst du ein gutes Tutorial, wo die Klasse BufferedImage beschrieben ist? Das würde mich doch sehr interessieren!

Danke!

mfg,
Christian.


----------



## Hansdampf (9. Mai 2005)

das hab ich dir schon mal geschrieben:

das int[] bekommst du mit
DataBuffer db=((BufferedImage)image).getRaster().getDataBuffer();
DataBufferInt dbi=(DataBufferInt)db;
int[] b=dbi.getData(); 

(vielleicht sind Syntaxfehler drin)
das Image kannst du dann sofort setzen. Sobald du einen Pixel im int[] veränderst wird glaub ein flag gesetzt, dass das Image beim nächsten "Painten" updated. Damit zerstört man zwar die hardwareseitige Beschleunigung (die BufferedImages nunmal haben), reicht aber aus. Bei meim Spiel bekomme ich über 50fps bei 800*600 und bin glücklich.
Kopieren kannst du int[]s auch prima mit System.arraycopy. 
Tutorial kenn ich nicht, aber Google hats.


----------



## Guest (18. Mai 2005)

thx!!! :applaus: 

genau nach so was hab ich ausschau gehalten

wenn ich das jetz öfters benutze, is das performance mäßig (auch was den RAM betrifft!!) ertragbar?

ich machen ein jump n run spiel, wenn eine kugel (z.b. ein abgefeuerter feuerball von mir aus) eine wand trifft, dann soll sie explodieren, dann würde ich die pixel im array verändern, damit ich nich hunderte images laden muss.

da das ganze netzwerk-basierend is und man schon ca. 6-20 (so viel eben geht)  spieler haben sollte, frag ich mich ob das möglich is, weil ja viele arrays viel speicher verschwenden, und wenn die methode nich so gut is...


----------

