Eccezione ArrayIndexOutOfBoundsException

di il
9 risposte

Eccezione ArrayIndexOutOfBoundsException

Salve,
la mia applicazione che carica un'immagine ed applica successivamente dei filtri lancia questa eccezione
java.lang.ArrayIndexOutOfBoundsException: Coordinate out of bounds!
quando cerco di fare questo:
for (int y = 0; y < height; y++) {
            for (int x = 0; x < width; x++) {
                argb1 = image1.getRGB(x, y);
                argb2 = image2.getRGB(x, y);
dove height e width sono le dimensioni della prima immagine.
L'eccezione si verifica quando le due immagini non sono della stessa dimensione, per cui devo usare sempre immagini di dimensioni uguali?
Grazie

9 Risposte

  • Re: Eccezione ArrayIndexOutOfBoundsException

    Certo che va in ArrayIndexOutOfBoundsException, perché nel momento in cui hai finito di scandire la seconda immagine, l'iterazione continuerà perché hai la grandezza della prima.

    No semplicemente fai due for separati, uno per la prima immagine e uno per la seconda immagine.
    Ciao
  • Re: Eccezione ArrayIndexOutOfBoundsException

    MariaMaria ha scritto:


    L'eccezione si verifica quando le due immagini non sono della stessa dimensione, per cui devo usare sempre immagini di dimensioni uguali?
    Il codice di per sé è corretto e ha senso. Ma il problema (concettuale) è un altro. Con il tuo approccio le immagini devono avere la stessa dimensione. Perché mi pare ovvio che siccome usi width/height della prima immagine, se questa è più grande della seconda, gli indici vanno ad un certo punto in out-of-bound per la seconda!

    La questione è: date due immagini di dimensioni diverse, come vuoi trattare le due superfici? Vuoi andare ad operare solo sulla dimensione che è "comune" ad entrambe? E i pixel eventualmente "fuori" rispetto all'altra dimensione, li vuoi trattare o no e se sì come? Questo devi stabilirlo tu e fare una logica un po' diversa.
  • Re: Eccezione ArrayIndexOutOfBoundsException

    Grazie per la risposta ad entrambi.
    semplicemente fai due for separati
    In realtà a me servirebbe nel for modificare il valore dei pixel delle due immagini, quindi con for separati non potrei farlo.

    Con il tuo approccio le immagini devono avere la stessa dimensione.
    Avrei fatto anche questo controllo nel metodo in cui richiamo i for precedenti
    if ((img1H > img2H) && (img1W > img2W)) {             
                image3 = new BufferedImage(img2W, img2H, image2.getType());
                image3 = calcola(image1, image2, image3, img2W, img2W);
            } else {
                image3 = new BufferedImage(img1W, img1H, image1.getType());
                image3 = calcola(image1, image2, image3, img1H, img1W);
            }
    per cui base alla dimensione dell'immagine più piccola vorrei creare una nuova immagine con la più piccola dimensione tra le due e richiamare il metodo opportuno.
    Vuoi andare ad operare solo sulla dimensione che è "comune" ad entrambe?
    Si
    Grazie e se sbaglio altro indicatemelo cortesemente
  • Re: Eccezione ArrayIndexOutOfBoundsException

    Scusatemi ho risolto, passavo lo stesso parametro come altezza e larghezza.
    Grazie ancora
  • Re: Eccezione ArrayIndexOutOfBoundsException

    MariaMaria ha scritto:


    Avrei fatto anche questo controllo nel metodo in cui richiamo i for precedenti
    Vuoi andare ad operare solo sulla dimensione che è "comune" ad entrambe?
    Si
    int width1 = ......
    int height1 = ......
    
    int width2 = ......
    int height2 = ......
    
    int minWidth = Math.min(width1, width2);
    int minHeight = Math.min(height1, height2);
    
    // .... usa minWidth/minHeight per creare image3
    // .... cicli for che usano minWidth e minHeight nella condizione
    Alla fin fine è tutta qui la logica per operare sulla dimensione "comune".
  • Re: Eccezione ArrayIndexOutOfBoundsException

    Usa ciò che ti ha detto andbin...il tuo codice non è corretto né esente da errori

    
    if ((img1H > img2H) && (img1W > img2W)) {             
                image3 = new BufferedImage(img2W, img2H, image2.getType());
                image3 = calcola(image1, image2, image3, img2W, img2W);
            } else {
                image3 = new BufferedImage(img1W, img1H, image1.getType());
                image3 = calcola(image1, image2, image3, img1H, img1W);
            }
    
    fai conto che hai due immagini
    img1 = 800 x 1300
    img2 = 900 x 1200

    quindi avresti
    if(1300>1200 && 800>900)
    questo ricadrebbe nell'else perché hai una ipotesi vera e l'altro falsa (true&false=false)
    quindi non verrebbe presa l'immagine più piccola, bensi avresti l'immagine con la grandezza maggiore.
    Quindi ricadresti appieno nell'errore nel momento in cui le due immagini siano in questa particolare configurazione.

    Ciao.
  • Re: Eccezione ArrayIndexOutOfBoundsException

    Grazie provvedo subito ad inserire il suggerimento di andbin
  • Re: Eccezione ArrayIndexOutOfBoundsException

    Scusatemi un ultimo dubbio se facessi questo:
    int minH = Math.min(img1H, img2H);
            int minW = Math.min(img1W, img2W);
            image3 = new BufferedImage(minW, minH, BufferedImage.TYPE_INT_ARGB);
    
    come terzo parametro non posso più passare il tipo della prima o della seconda immagine, come faccio a sapere che tipo mettere?
    Grazie
  • Re: Eccezione ArrayIndexOutOfBoundsException

    MariaMaria ha scritto:


            image3 = new BufferedImage(minW, minH, BufferedImage.TYPE_INT_ARGB);
    
    come terzo parametro non posso più passare il tipo della prima o della seconda immagine, come faccio a sapere che tipo mettere?
    TYPE_INT_ARGB va bene ed è più che appropriato in generale. Questo però è solo il tipo che viene usato per creare il ColorModel che è poi quello che definisce come sono rappresentati i pixel nel raster interno.

    Quando usi getRGB/setRGB il int che passi/ricevi è sempre inteso nel formato TYPE_INT_ARGB, ovvero 0xAARRGGBB, indipendentemente dal ColorModel del image. Se il formato interno è diverso, avverrà una conversione implicita. Ed è ovvio che se creassi la immagine con es. TYPE_USHORT_555_RGB, qualcosa lo "perdi" rispetto ad avere 8 bit per componente!
Devi accedere o registrarti per scrivere nel forum
9 risposte