繁体   English   中英

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

[英]How to make bmp image from pixel byte array in java

我有一个包含来自 a.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) 抛出异常{ int[] pixels = byteToInt(pixelData); BufferedImage 图片 = 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 栅格 = (WritableRaster) image.getData(); raster.setPixels(0, 0, 宽度, 高度, 像素); image.setData(光栅); 返回 getBufferedImageToBmpByteArray(图像); } private byte[] getBufferedImageToBmpByteArray(BufferedImage image) { byte[] imageData = null; 尝试 { ByteArrayOutputStream bas = new ByteArrayOutputStream(); ImageIO.write(图像, "bmp", bas); imageData = bas.toByteArray(); bas.close(); } catch (Exception e) { e.printStackTrace(); } 返回图像数据; } private int[] byteToInt(byte[] data) { int[] ints = new int[data.length]; 对于 (int i = 0; i

您需要将三个字节打包到您制作的每个 integer 中。 根据缓冲图像的格式,这将是 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()

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM