Ecco la seconda parte della guida sulla manipolazione delle immagini in Java, questa guida inizia parlando di ImageProducer e delle classi che la implementano, noi tratteremo MemoryImageSource, partiamo subito con un esempio:

/**/
// A differenza degli altri codici questo è tratto da "La guida completa Java 2"
//per praticità
import java.applet.*;
import java.awt.*;
import java.awt.image.*;

public class MIG extends Applet {
Image img;
public void init() {
Dimension d = getSize();
int w = d.width;
int h = d.height;
int pixels[] = new int[w * h];
int i = 0;

//Qui si inizia a "pasticciare sui pixel"
for(int y = 0; y < h; y++) {
for(int x = 0; x < w; x++) {
int r = (x^y) & 0xff;
int g = (x*2^y*2) & 0xff;
int b = (x*4^y*4) & 0xff;
pixels[i++] = (255 << 24) | (r << 16) | (g << 8) | b;
}
}

//Il risultato lo inseriamo in un Image
img = createImage(new MemoryImageSource(w, h, pixels, 0, w));
}

public void paint(Graphics g) {
//Visualizza
g.drawImage(img, 0, 0, this);
}

}
/**/

Consiglio a tutti di provare il codice o scaricare dalla sezione programmi gli esempii, l'applet è davvero bello da vedere; potete notare che con questa classe è possibile creare un'immagine direttamente settando il valore dei pixel e avere il massimo del controllo sul risultato, divertitevi a cambiare la manipolazioni sui pixel!

Il contrario di ImageProducer è ImageConsumer, una classe astratta che estrapola i pixel da un'immagine, la classe concreta che lo implementa è PixelGrabber, vediamo subito un esempio:

/**/
import java.applet.*;
import java.awt.*;
import java.awt.image.*;

public class pg extends Applet {
Image img, res;
PixelGrabber pix;
int iw, ih, w, h;
int i = 0;
int pixels[];
Dimension d;

public void init() {

d = getSize();
w = d.width;
h = d.height;

try {
img = getImage(getDocumentBase(), "Fuoco.jpg");
MediaTracker t = new MediaTracker(this);
t.addImage(img, 0);
t.waitForID(0);//attende che l'immagine sia caricata fino alla fine
iw = img.getWidth(null);
ih = img.getHeight(null);
pixels = new int[iw * ih];
pix = new PixelGrabber(img, 0, 0, iw, ih, pixels, 0, iw);
pix.grabPixels();
} catch(Exception e) {
e.printStackTrace();
}

//Questa volta pasticciamo sui pixel dell'immagine sorgente
for(int i = 0; i < pixels.length; i++) {
pixels[i] |= 255 << pixels[i];
}

//Creiamo un Image; l'effetto risultante è simile ad un visore termico(venuto fuori casualmente ;-) )
res = createImage(new MemoryImageSource(iw, ih, pixels, 0, iw));
}

public void start() {

}

public void update() {}

public void paint(Graphics g) {
g.drawImage(res, 0, 0, this);
}
}
/**/

Provate a pasticciare coi pixel anche qui, prima di trovare questo effetto mi sono venuti altre decine di cose belle da vedere, se sbagliate matematicamente(facendo un colore inesistente o bianco) non vedrete l'immagine(quindi capirete di aver sbagliato).

Consiglio ancora di scaricare gli esempi dalla sezione programmi, li ci sono le immagini su cui ho testato che mettono in risalto per bene l'effetto!

Ora parleremo della classe ImageFilter e dei risultato, praticamente sono delle classi che filtrano una sorgente di pixel in maniera già organizzata(senza fare tutto a mano), un esempio di questa classe è CropImageFilter, che praticamente permette di "tagliare un immagine"(utile per caricare più immagini, visto che la JVM è più veloce ha caricare 1 immagine da 40k che 20 immagini da 2 k), un'altra classe molto interessante è RGBIImageFilter che può servire per creare dei processi di filtraggio automatici per aumentare la luminosità, il contrasto o cose simili, come dice il nome intervendndo sui colori(RBG).

Bene, dopo questa panoramica credo abbiate capite come si gestiscono queste classi, il concetto sta sempre li createImage(new Sorgente blablabla) si pasticcia sui pixel si chiama il metodo giusto e alla fine si visualizza. Non posso che consigliarvi di guardare la documentazione Sun che ha tutti i metodi disponibili e anche esempi più complessi; se poi volete usare al meglio queste cose dovreste studiare bene gli operatiri bit-a-bit e le varie correlazioni con le immagini per creare effetti più sbalorditivi.

Disponibile su forum e mail.