2017-09-27 17 views
0

Je suis en train de créer une image en utilisant ce tableau: [-8421505, -8421505, -8421505, -8421505, ...] sa longueur est: 62416ArrayIndexOutOfBoundsException lors de la création d'une image à l'aide Raster

BufferedImage img = new BufferedImage(166, 376, BufferedImage.TYPE_INT_RGB); 
int pixels[] = new int[166 * 376]; 

et voici où l'erreur doit être

img.getRaster().setPixels(0, 0, 166 , 376, pixels);

je sauve juste

File file = new File("new.png"); 
ImageIO.write(img, "png", file); 

qui est:

ArrayIndexOutOfBoundsException: 62416

+1

Peut-être que cela pourrait être utile: Des ([docs] https://docs.oracle.com/javase/8/docs/api/java/awt/image/WritableRaster.html#setPixels-int- int-int-int-double: A-): 'ArrayIndexOutOfBoundsException' - si les coordonnées ne sont pas dans les limites, ou si' dArray' est trop petit pour contenir l'entrée. – Zabuza

+0

(à propos de la méthode setPixels): De même pour javadocs: Définit tous les échantillons pour un rectangle de pixels à partir d'un double tableau contenant un échantillon par élément de tableau. Une exception ArrayIndexOutOfBoundsException peut être levée si les coordonnées ne sont pas dans les limites. Cependant, la vérification des limites explicites n'est pas garantie. – pringi

+1

C'est parce que votre raster utilise 1 ints par canal (3 au total). donc votre tableau doit être 'new int [166 * 376 * 3]' – matt

Répondre

0

Pour une raison quelconque, même si il semble que BufferedImage.TYPE_INT_RGB devrait avoir 1 int par pixel. Lorsque vous utilisez WritableRaster#setPixels, il faut réellement 3 ints par pixel.

Compte tenu des données d'entrée,

int[] values = {...}; 

Où chaque int correspond à un pixel, avec 8 bits pour RGB respectivement. Ils auraient besoin d'être mis dans un plus large éventail, et déballé. J'ai vérifié cela en créant un tableau de valeurs avec le rouge, le vert et le bleu.

int[] values = new int[166*376]; 
for(int i = 0; i<166*125; i++){ 
    values[i] = 0xff0000; //red 
} 
for(int i = 166*125; i<166*250; i++){ 
    values[i] = 0xff00; //green 
} 
for(int i = 166*250; i<166*376; i++){ 
    values[i] = 0xff; //blue 
}