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

Posted

技术标签:

【中文标题】如何在java中从像素字节数组制作bmp图像【英文标题】:How to make bmp image from pixel byte array in java 【发布时间】:2012-04-21 02:34:16 【问题描述】:

我有一个字节数组,其中包含来自 .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) 抛出异常 int[] 像素 = byteToInt(pixelData); BufferedImage 图像 = null; 如果(深度 == 8) 图像 = 新的 BufferedImage(宽度,高度,BufferedImage.TYPE_BYTE_GRAY); 否则如果(深度 == 24) 图像 = 新的 BufferedImage(宽度,高度,BufferedImage.TYPE_INT_RGB); WritableRaster 栅格 = (WritableRaster) image.getData(); raster.setPixels(0, 0, 宽度, 高度, 像素); image.setData(光栅); 返回 getBufferedImageToBmpByteArray(image); 私有字节 [] getBufferedImageToBmpByteArray(BufferedImage 图像) 字节 [] 图像数据 = 空; 尝试 ByteArrayOutputStream bas = new ByteArrayOutputStream(); ImageIO.write(image, "bmp", bas); imageData = bas.toByteArray(); bas.close(); 捕捉(异常 e) e.printStackTrace(); 返回图像数据; 私有 int[] byteToInt(byte[] 数据) int[] ints = new int[data.length]; for (int i = 0; i

【问题讨论】:

您当前设置图像数据的代码在哪里? 你真的需要阅读Raster吗?你试过reading/writing with a ByteArrayOutputStream 吗? @Leigh 您提供的链接是关于从另一个不同类型的图像制作图像(特定类型)。但问题是我没有图像,我得到了 bmp 图像的像素部分(以及像素的宽度和高度)。谢谢你的努力.. 每个像素有多少字节?宽度 * 高度 vs 像素长度? @daveb 对于彩色图像,深度为 24,因此每个像素 3 个字节。我没有清楚地得到你的第二个问题。可能你在问字节数组的长度。长度是宽度 * 高度 * 3。谢谢你的时间.. 【参考方案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, offset, length).toInt()

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于如何在java中从像素字节数组制作bmp图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中从原始字节 [] 创建 BMP 文件

int像素数组到java中的bmp

读取 .bmp 图像并从图像的第 10 个字节中减去 10 并在 Java 中重新创建图像

将字节数组转换/显示为 bmp/jpeg 图像

使用 JavaFX 将 BMP 加载到字节数组中

BMP字节数组到BMP图像php