如何使从Java中像素字节数组BMP图片(How to make bmp image from pi

2019-09-16 10:09发布

我已经从.bmp文件包含的像素值的字节数组。 它是由这样产生的:

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

现在,我需要重新创建.BMP图像。 我试图让一个BufferedImage,并通过调用设置的WritableRaster像素setPixels方法。 但我必须提供一个int [],漂浮[]或加倍[]数组。 也许我需要的字节数组转换为其中之一。 但我不知道该怎么做。 我也尝试了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帮助将不胜感激.. :)

Answer 1:

您需要打包三个字节为你做的每一个整数。 根据缓冲图像的格式,这将是为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,偏移,长度) .toInt()



Answer 2:

刚刚一个字节数组是不够的。 您还需要构建一个头(如果你是从一个原始格式阅读,如DICOM文件中)。



文章来源: How to make bmp image from pixel byte array in java