Newsgroup: it.comp.java
Titolo: getSubImage -  (x + width) is outside of Raster (????)

Salve,
devo lavorare su parti di un'immagine.
Mi spiego meglio: devo dividere l'immagine in tot parti (quarti, sedicesimi,
trendaduesimi, etc etc) e lavorare su ogni parte.
Con due while scorro l'immagine e seleziono la regione.
Alla seconda iterazione (del while interno) viene sollevata:
java.awt.image.RasterFormatException: (x + width) is outside of Raster
da image.getSubimage(....).
I dati dell'immagine sono:
width: 500
height: 387
Alla prima iterazione:
X: 0
Y: 0
Alla seconda iterazione:
X: 166
Y: 0
ora, x+chunkWidth = 166 + 166  = 332 che è sicuramente minore di 500,
che è la larghezza dell'immagine.
Qualcuno puo gentilmente dirmi dove sbaglio?
Ringrazio anticipatamente chi volesse aiutarmi!
Un saluto,
Gabriele
Segue codice:
height = image.getHeight(); //altezza immagine
width = image.getWidth(); //larghezza immagine
int chunkHeight = 129; //altezza rettangolo da selezionare
int chunkWidth = 166; //larghezza rettangolo da selezionare
int y = 0, x = 0; // coordinate spigolo in alto a sx del rettangolo
while (height > y){
	x = 0;
	while (width > x ){
     			image = image.getSubimage(x,y, chunkWidth, chunkHeight);
			//...compressione...
			x += chunkWidth;
      		}
     		y += chunkHeight;
 
 
     	}

         }
Prova a metterti un po' di System.println() per vedere se le variabili 
hanno il valore che ti aspetti.
Per esempio sei sicuro che image.getHeight() restituisca 387?
Stampa alla fine di ogni ciclo il valore di x e width, e di y e height.
Dovresti scoprire il problema.
I cicli si possono scrivere in modo piu' naturale il for:
for(int y=0; y < height;  y+= chunkHeight) {
    for(int x = 0; x < width; x+= chunkWidth) {
       image = image.getSubimage(x,y, chunkWidth, chunkHeight);
       //...compressione...
    }
}
-- 
Andrea Francia
http://www.andreafrancia.it/

 I cicli si possono scrivere in modo piu' naturale il for:
si lo so bene, e nulla cambia in questo caso...
Grazie comunque.
Un saluto,
Gabriele

 il rettangolo è nell'immagine).
Non avevo letto bene il tuo messaggio, mi era sfuggita l'eccezione.
credo che basti cambiare la chiamata da così:
	image = image.getSubimage(x,y, chunkWidth, chunkHeight);
a così :
	clippedWidth = x - min(x + chunkWidth, image.getWidth());
	clippedHeight = y - min(y + chunkHeight, height.getHeight());
	image = image.getSubimage(x,y, clippedWidth , clippedHeight );


 
Alla prima iterazione clippedWidth vale -166... (e ovviamente risolleva
l'eccezione)
riporto i dati dal primo messaggio
width: 500
height: 387
int chunkHeight = 129;
int chunkWidth = 166;
X: 0
Y: 0
Non ho capito comunque cosa rappresenta clippedWidth.
Comincio a essere veramente disperato :(((
Grazie ancora,
Gabriele

 l'eccezione)
Ho cannato qualcosa, l'ho scritta di getto :/
Riprovo senza usare virtuosismi tipo il min()
  int clippedWidth;
  if( x  + chunkWidth < image.getWidth() ) {
     clippedWidth = chunkWidth
  } else {
     clippedWidth = image.getWidth() - x;
  }
Così non esci dai bordi dell'immagine.


 Così non esci dai bordi dell'immagine.
Ti ringrazio!
ho scoperto dov'era il problema:
io tagliavo un'area la comprimevo e poi la andavo
a sostituire alla foto originale, per questo alla seconda
iterazione al posto della foto originale si trovata un
"rettangolino".
Avrei un altro quesito:
procedendo come sopra, come posso poi andare a
salvare i vari rettangoli, che comprimo man mano,
per ottenere un'immagine?
forse ho trovato il modo di farlo con JAI ma non avendo
mai usato quel package, preferirei evitare.
Grazie ancora e buona serata!
G.