2013-07-30 2 views
3

왜이 메서드는 인덱스를 벗어난 인덱스를 throw합니까? 데이터에서 이미지를 만들려고 노력하며 자신을 생성하고 이것이 효과가있을 것으로 기대했습니다.float 배열에서 이미지 만들기, 범위를 벗어난 인덱스

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

스레드를 사용합니까? 그런 다음 가능성이있을 수 있습니다, 당신은 데이터 배열을 변경합니다. –

+0

아니, 나는 singlethreaded 두려워, 테스트 케이스 그냥 임의의 데이터 배열을 생성하고 이미지를 만들려고합니다. – arynaq

+0

부동 소수점을 INT_ARGB 타입 버퍼에 저장하는 이유를 묻는 것은 무식한 질문입니까? – usr2564301

답변

1

Raster 폭과 높이 변수 대신 BufferedImage 폭과 높이를 가변하여보십시오. 또한 Raster.getMinX()Raster.getMinY()

을 사용하십시오. float 배열의 모든 값은 픽셀 값이 아닙니다. 모든 값은 색상 구성 요소 값입니다. 따라서 2x1 이미지는 실제로 ARGB 색상 구성 요소가 있으므로 길이 4 일 필요가 있습니다. 예를 들어,이 × 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

관련 문제