如何从java中的像素字节数组制作bmp图像

时间:2012-04-08 07:06:04

标签: java bufferedimage pixels raster

我有一个包含.bmp文件中像素值的字节数组。这是通过这样做生成的:

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

现在我需要重新创建.bmp图像。我尝试通过调用setPixels方法创建一个BufferedImage并设置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方法有关。如果有人知道如何改进它或者有一个新的更简单的解决方案,那么你的帮助将会受到赞赏.. :)

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分:0)

只有一个字节数组是不够的。您还需要构建一个标题(如果您正在读取原始格式,例如在DICOM文件中)。