L'errore principale sta nei valori che passi alla funzione
codice:
public abstract boolean drawImage(Image img,
int dx1, int dy1, int dx2, int dy2,
int sx1, int sy1, int sx2, int sy2,
ImageObserver observer);
infatti impostando i valori dx e dy come hai fatto tu disegnerà sempre nella stessa area. Io invece ti consiglio di utilizzare quest'altra drawImage:
codice:
public abstract boolean drawImage(Image img, int x, int y,
ImageObserver observer);
[list=a][*]img -> l'immagine da disegnare[*]x e y -> le coordinate del punto dove iniziare a disegnare img[/list=a]
codice:
public static BufferedImage mergeImage(BufferedImage[] images, int rows, int columns)
{
if(rows * columns > images.length)
throw new IllegalArgumentException();
int maxWidth = 0,
maxHeight = 0;
for(BufferedImage img: images) {
if(img.getWidth() > maxWidth)
maxWidth = img.getWidth();
if(img.getHeight() > maxHeight)
maxHeight = img.getHeight();
}
BufferedImage targ = new BufferedImage(maxWidth * columns, maxHeight * rows, images[0].getType());
Graphics2D g = targ.createGraphics();
for(int r = 0; r < rows; r++)
for(int c = 0; c < columns; c++)
g.drawImage(images[r + c], c * maxWidth, r * maxHeight, null);
g.dispose();
return targ;
}
Quindi ogni volta che disegni l'immagine devi fornirgli anche il nuovo punto dove disegnarla, e lo ricavi dalle dimensioni della img e dal numero di colonna e riga in cui devi collocare img.
In questo caso la funzione crea una griglia che ha le posizioni della grandezza dell immagine più grande presente nell'array, ma con un paio di modifiche la si può rendere più "flessibile".
Fammi sapere se va tutto bene