2013-07-30 85 views
3

爲什麼此方法會將索引超出邊界錯誤?試圖從我自己生成的數據創建一個圖像,我預計這會工作。從浮點數組中創建圖像,索引超出範圍

private BufferedImage getImageFromFloatArray(float[] data, int w, int h) { 
    BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
    System.out.println("Image pixel array size: " 
        + ((DataBufferInt) img.getRaster().getDataBuffer()) 
          .getData().length); 
    System.out.println("Datasize: " + data.length); 
    WritableRaster raster = img.getRaster(); 
    raster.setPixels(0, 0, w, h, data); 
    return img; 
} 

堆棧跟蹤

Image pixel array size: 800000 
Datasize: 800000 
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 800000 
    at java.awt.image.SampleModel.setPixels(Unknown Source) 
    at java.awt.image.WritableRaster.setPixels(Unknown Source) 
    at image.PixelAraryToImageTest.getImageFromFloatArray(PixelAraryToImageTest.java:36) 
+0

Arent you using threads?那麼有可能發生這種可能性,那就是你改變了數據數組。 –

+0

不,我擔心它是單線程的,測試用例只是生成一個隨機數據數組並嘗試創建一個圖像。 – arynaq

+0

問你爲什麼要將浮點數存儲到INT_ARGB類型的緩衝區中是一個無知的問題? – usr2564301

回答

1

嘗試使用Raster寬度和高度的變量,而不是BufferedImage寬度和高度可變的。同樣使用Raster.getMinX()Raster.getMinY()

float數組中的每個值都不是像素值。每個值都是一個顏色分量值。因此,2x1圖像實際上需要長度爲4,因爲您擁有ARGB顏色分量。爲了讓一個2×1的圖像紅色例如,將需要像...

int numColorComponents = 4; 
float[] data = new float[imgWidth*imgHeight*numColorComponents]; 
raster.setPixels(minX,minY, rasterWidth,rasterHeight, data); 

而且,不像其他的圖形框架,這裏的float緩衝區不是歸一化值的緩衝區。其值在[0, 255]之間。因此,要將2x1圖像設置爲不透明紅色,緩衝區將爲:

float alpha = 255; 
float red = 255; 
float[] buffer = new float[]{alpha,red,0,0,alpha,red,0,0}; 
+0

啊,這是有道理的,我將不得不將每個樣本分解成四個組件,將會發布更新。 – arynaq

+1

工作,謝謝 – arynaq