Hem E-böcker Specialeffekter och spelutveckling i Java MemoryImageSource klassen

Specialeffekter och spelutveckling i Java(TM) - MemoryImageSource klassen

av Anibal Wainstein

7.0.2 MemoryImageSource klassen

Som du kanske redan har listat ut det, så lagras pixelvärderna för en appletskärm eller bild (Image) i en enda lång heltals-array. Arrayens organisation beror på skärmens eller bildens storlek. I arrayen följer först alla pixlarna i den första raden, där den första pixeln är pixeln som är placerad längst till vänster i bilden. Efter det följer hela den andra raden osv. Så om din bild eller skärm har en bredd på 200 pixels så kommer de 200 första pixlarna att vara raden y=0 (positionerna [0..199] i arrayen). Pixlarna för raden y=1 kommer efter, med pixeln längst till vänster som första pixel (positionerna [200..399] är pixlarna i raden y=1).

Ovanstående bild visar pixelrepresentationen (varje pixels index i arrayen) av en urklipp ur en liten bild med storleken 16x16 pixels.


Om du tycker att det här verkar svårt så finns det ett sätt att enkelt kunna ta fram ett pixelvärde ur en bild-array. Anta att vår skärm finns lagrad i int-arrayen "myscreen" och du vill få tag i pixeln på positionen x=233 och y=168 :

int width = 300;
int height = 200;
int onepixel = myscreen[233 + 168*width];

Med uttrycket "x + y*width" kan du alltid få tag i rätt pixel. Variabeln "width" är bredden på bilden. Enkelt, eller hur?

Klassen MemoryImageSource, som finns i paketet java.awt.image, används för att skapa ett objekt som baseras på en int-array. Objektet används senare för att skapa en Image objekt av det med en överlagrad version av createImage() metoden. När man skapar en MemoryImageSource-klass så kräver den som argument: bredd och höjd på bilden, arrayen själv, samt start- och slutpositionen i horizontell led där klassen kommer att hämta pixelvärdena. Själv har jag alltid använt positionerna 0 och width (bredden på bilden) för de två sista argumenten (egentligen har man ingen nytta av dessa argument, dom är bara där för att krångla till det):

//Vi skapar först en array med 300x200 pixlar.
int myimagearray[] = new int[300*200]; 

//Bredden är 300 och höjden 200.
int width = 300;
int height = 200;

//Skapa ett MemoryImageSource-objekt av arrayen.
MemoryImageSource mysource;
mysource=new MemoryImageSource(width,height,myimagearray,0,width);

//Nu kan man använda objektet för att skapa en bild med 
//hjälp av createImage().
Image myimage=createImage(mysource);

Efter att ha skapat ett MemoryImageSource objekt är det bara att använda Applet-klassens createImage() för att skapa en bild. Bilden kan du sedan rita ut på skärmen eller på bildbufferten, om du vill. Varför de som designade Java, inte skapade en createImage() metod som tog dessa argument direkt, är ett mysterium.

 


Nästa sida >>