如何在Java中从像素字节数组创建bmp图像

4

我有一个包含从 .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
到目前为止,这是我所做的。

你当前设置图像数据的代码在哪里? - Perception
每个像素有多少字节?宽度乘以高度与像素长度相比如何? - daveb
@daveb 对于彩色图像,深度为24,因此每个像素需要3个字节。我没有清楚地理解你的第二个问题。也许你在问字节数组的长度..长度是宽度高度3。感谢您的时间.. - waiting_for_peace
@waiting_for_peace - 是的,我知道那种方法不能仅使用像素数据。实际上,我是在问你是否真的需要处理像素,而不是整个图像二进制?但听起来你确实需要。 - Leigh
我发现这段代码运行良好。 http://www.java2s.com/Code/Java/Collections-Data-Structure/bytearraytointarray.htm - Mossaddeque Mahmood
显示剩余2条评论
2个回答

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文件内部)读取,则还需要构造标题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接