2012-10-31 21 views
0

我正在嘗試處理圖像文件並將其作爲Image對象返回,但是當我調用公共靜態BufferedImage時,出現ArrayIndexOutOfBoundsException異常getImageFromArray(int [ ]數據,int列,int行)。在Java中創建緩衝圖像時數組索引超出界限

我已經存儲到一個數組以下像素的顏色命名爲「數據」:

[255,6,65,78,99,100,25,0,45,66,88,190,88,76,50] 

我分析了這一點,從一個看起來像這樣的文本文件:我想

255, 6, 65, 78, 99 
100, 25, 0, 45, 66 
88, 190, 88, 76, 50 

通過使用BufferedImage從這個數據生成一個圖像,目前我正在用這個打磚牆。根據上面的表結構將列和行傳遞給它。

public static BufferedImage getImageFromArray(int[] data, int columns, int rows) { 
    BufferedImage image = new BufferedImage(columns, rows, BufferedImage.TYPE_INT_RGB); 
    WritableRaster raster = (WritableRaster) image.getData(); 
    raster.setPixels(0,0, columns, rows, data); 
    image.setData(raster); 
    return image; 
} 

當我點擊raster.setPixels調用時,出現OOB異常。這是否需要一個不同的數組或值我缺少?

+3

一種AIOOBException將由[#的WritableRaster的setPixels](HTTP拋出:// docs.oracle.com/javase/7/docs/api/java/awt/image/WritableRaster.html#setPixels%28int,%20int,%20int,%20int,%20int[]%29)if if「如果座標是不在界限內,或者iArray太小而無法保存輸入。「你可以消除第一個原因,因此推斷'data'數組的大小比'columns * rows'小。我建議調試你的值。 – Vulcan

+0

在WriteableRaster中,我確實在光柵內看到了maxX = 5和maxY = 3,我不清楚如何將此數組設置爲合適的大小。 – 3ck

+0

爲什麼downvote,我沒有得到它?它是一個有效的問題,寫得很好。 – Siddharth

回答

1

這裏是我找到了解決辦法,RGB需要3個條帶的類型...因此,以創建工作的數組:

private int[] imageArray(String fullFilePath, int rows, int columns) throws Exception{ 
    int picRows = rows; 
    int picColumns = columns; 
    data = getPixelData(fullFilePath); 

    //3 bands in TYPE_INT_RGB 
    int NUM_BANDS = 3; 
    int[] arrayImage = new int[picRows * picColumns * NUM_BANDS]; 

    for (int i = 0; i < picRows; i++) 
    { 
     for (int j = 0; j < picColumns; j++) { 
      for (int band = 0; band < NUM_BANDS; band++) 
       for (int k = 0; k < data.length; k++) 
        arrayImage[((i * picRows) + j)*NUM_BANDS + band] = data[k]; 
     } 
    } 
    return arrayImage; 
}