2017-09-23 6 views
0

그레이 스케일 이미지 데이터의 바이트 배열을 사용하여 JavaFX WritableImage를 만드는 데 관련된 문제가 있습니다. PixelWriter.setargb 사용

나는 BufferedImage에 대한 작업 함수를 작성했지만 이미지는 모든 항목이 0

이이 작업 방법과 동일과 나에게 이미지를 반환하지 무엇 나에게 보이는 것은 동등한 방법으로 :

private static BufferedImage getBufferedImageFromData(int height, int width, byte[] data) {  
    BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

    for(int i = 0; i < width * height; ++i){ 
     int a = 0xFF << 24; 
     int r = (data[i] & 0xFF) << 16; 
     int g = (data[i] & 0xFF) << 8; 
     int b = data[i] & 0xFF; 

     int x = i % width; 
     int y = (i - x)/width; 

     result.setRGB(x, y, a | r | g | b); 
    } 

    return result;  
} 

그리고 이것은 (0으로 설정 모든 픽셀로 이미지를 반환) 자바 FX에 대한 동등한 방법에 나의 시도 : 이제

private static Image getImageFromData(int height, int width, byte[] data)  { 
    WritableImage wr = new WritableImage(width, height); 
    PixelWriter pw = wr.getPixelWriter(); 

    for(int i = 0; i < width * height; ++i) { 
     int r = (data[i] & 0xFF) << 16; 
     int g = (data[i] & 0xFF) << 8; 
     int b = data[i] & 0xFF; 

     int x = i % width; 
     int y = (i - x)/width; 

     pw.setArgb(x, y, r | g | b); 
    } 
    return wr; 
} 

을, 내가 할 수있는 유일한 이유 지금까지 내가 0으로 채워진 이미지를 얻는 이유는 내가 올바르게 값을 형식화하지 않았다는 것입니다. 즉, BufferedImage.setRGB는 지정된 값의 형식을 지정하고 PixelWriter.argb는 형식화 된 값이 있어야합니다. 내가 시도한 방법을 비교 한 매우 시간이 강한 것으로 보인다 :

는 나는 그것이 내가 PixelWriter.setPixels를 사용하지 않는 이유에

을 작동하도록 변경해야 할 것입니다 정확히 몰라 현재의 3 배 크기의 새 배열을 설정해야만 메서드에 넘길 수 있습니다. 어쨌든 시도해 보았습니다. 실패했습니다.

덕분에 어떤 도움

답변

1

을 위해 당신은 argba 부분에 대해 잊어 버렸습니다. 즉, 알파 채널로 0의 픽셀을 씁니다. 즉, 모든 픽셀이 완전히 투명 함을 의미합니다. 정수 부서가 잘립니다 때문에 내가 i/width로 단순화 (i - x)/width를했습니다

private static Image getImageFromData(int height, int width, byte[] data) { 
    WritableImage wr = new WritableImage(width, height); 
    PixelWriter pw = wr.getPixelWriter(); 

    for (int i = 0; i < width * height; ++i) { 
     int value = data[i] & 0xFF; 
     int r = value << 16; 
     int g = value << 8; 
     int b = value; 

     int x = i % width; 
     int y = i/width; 

     // include alpha here 
     pw.setArgb(x, y, (0xFF<<24) | r | g | b); 
    } 
    return wr; 
} 

참고 : 당신은 완전히 불투명 이미지를 만들 100%에 알파 채널을 설정해야합니다.

+0

고맙습니다. 이것은 그것을 설명하고 완벽하게 작동합니다. –