2012-04-08 57 views
4

我有一個包含.bmp文件中的像素值的字節數組。它是通過這樣做生成的:如何從java中的像素字節數組中製作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方法有關的..如果有人知道如何改進它或得到了一個新的和更簡單的解決方案,我們將不勝感激... :)

+0

小心你當前的代碼設置圖像數據? – Perception 2012-04-08 07:26:09

+0

你真的需要閱讀'Raster'嗎?你有沒有嘗試[讀/寫與ByteArrayOutputStream](http://stackoverflow.com/a/356650/104223)? – Leigh 2012-04-09 01:47:45

+0

@Leigh你給出的鏈接是關於從另一個不同類型的圖像中製作一個(特定類型的)圖像。但問題是我沒有圖像,我已經得到了BMP圖像的像素部分(以及像素中的寬度和高度)。感謝你的努力.. – 2012-04-11 06:17:06

回答

2

你需要打包三個字節到每個你製作的整數。根據緩衝圖像的格式,這將是0xRRGGBB。

byteToInt則要消耗三個字節是這樣的:

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文件中)。

相關問題