2012-04-08 3 views
4

.bmp 파일의 픽셀 값을 포함하는 바이트 배열이 있습니다. 다음을 수행하여 생성되었습니다.자바에서 픽셀 바이트 배열에서 bmp 이미지를 만드는 방법

BufferedImage readImage = ImageIO.read(new File(fileName)); 
byte imageData[] = ((DataBufferByte)readImage.getData().getDataBuffer()).getData(); 

이제는 .bmp 이미지를 다시 만들어야합니다. BufferedImage를 만들고, setPixels 메서드를 호출하여 WritableRaster의 픽셀을 설정하려고했습니다. 하지만 거기에 int [], float [] 또는 double [] 배열을 제공해야합니다. 바이트 배열을이 중 하나로 변환해야 할 수도 있습니다. 하지만 어떻게해야할지 모르겠다. 나는 또한 setDataElements 방법을 시도했다. 하지만이 방법을 사용하는 방법을 잘 모르겠습니다.

누구나 바이트 배열에서 bmp 이미지를 만드는 방법을 설명 할 수 있습니까?

편집 : @Perception

이것은 내가 지금까지 무엇을했는지 있습니다 :

private byte[] getPixelArrayToBmpByteArray(byte[] pixelData, int width, int height, int depth) throws Exception{ int[] pixels = byteToInt(pixelData); BufferedImage image = null; if(depth == 8) { image = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY); } else if(depth == 24){ image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); } WritableRaster raster = (WritableRaster) image.getData(); raster.setPixels(0, 0, width, height, pixels); image.setData(raster); return getBufferedImageToBmpByteArray(image); } private byte[] getBufferedImageToBmpByteArray(BufferedImage image) { byte[] imageData = null; try { ByteArrayOutputStream bas = new ByteArrayOutputStream(); ImageIO.write(image, "bmp", bas); imageData = bas.toByteArray(); bas.close(); } catch (Exception e) { e.printStackTrace(); } return imageData; } private int[] byteToInt(byte[] data) { int[] ints = new int[data.length]; for (int i = 0; i < data.length; i++) { ints[i] = (int) data[i] & 0xff; } return ints; }

것은이 회색 이미지를 잘 작동하지만, 색상 이미지의 색상이 올바르지 않습니다. 나는 이것이 byteToInt 메소드와 관련이 있다고 생각한다. 만약 누군가 그것을 개선하는 방법을 알고 있거나 새롭고 더 쉬운 해결책을 얻었다면, ur help help appreciate. :)

+0

이미지 데이터를 설정하기 위해 현재 코드를 조정 하시겠습니까? – Perception

+0

'Raster'에서 정말로 읽어야합니까? [Read/Write with ByteArrayOutputStream] (http://stackoverflow.com/a/356650/104223)을 시도 했습니까? – Leigh

+0

@Leigh 링크는 다른 유형의 다른 이미지에서 (특정 유형의) 이미지를 만드는 것에 관한 것입니다. 하지만 문제는 이미지가 없다는 것입니다. 픽셀의 너비와 높이와 함께 bmp 이미지의 픽셀 부분을 얻었습니다. 통해 노력 주셔서 감사합니다. –

답변

2

각각에 3 바이트를 팩해야한다. 정수. 버퍼링 된 이미지의 형식에 따라 0xRRGGBB가됩니다.

byteToInt은 다음과 같이 3 바이트를 소비해야합니다 :

private int[] byteToInt(byte[] data) { 
    int[] ints = new int[data.length/3]; 

    int byteIdx = 0; 
    for (int pixel = 0; pixel < ints.length) { 
     int rByte = (int) pixels[byteIdx++] & 0xFF; 
     int gByte = (int) pixels[byteIdx++] & 0xFF; 
     int bByte = (int) pixels[byteIdx++] & 0xFF; 
     int rgb = (rByte << 16) | (gByte << 8) | bByte 
     ints[pixel] = rgb; 
    } 
} 

또한 단지 바이트 배열을 갖는 ByteBuffer.wrap(arr, offset, length) .toInt()

0

를 사용하는 것만으로는 충분하지 않습니다. 또한 헤더를 생성해야합니다 (DICOM 파일 내부와 같이 원시 형식을 읽는 경우).