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