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



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

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

现在我需要重新创建.bmp映像。我尝试制作一个缓冲图像,并通过调用setPixels方法来设置可写栅格的像素。但是在那里我必须提供一个 int[]、float[] 或 double[] 数组。也许我需要将字节数组转换为其中之一。但我不知道该怎么做。我也尝试了setDataElements方法。但是我也不确定如何使用这种方法。

谁能解释一下如何从字节数组创建 bmp 映像?

编辑:@Perception

这是我到目前为止所做的:

private byte[] getPixelArrayToBmpByteArray(byte[] pixelData, int width, int height, int depth) 抛出 Exception{ int[] 像素 = byteToInt(pixelData); 缓冲图像图像 = 空; if(depth == 8) { 图像 = 新的缓冲图像(宽度、高度、BufferedImage.TYPE_BYTE_GRAY); } else if(depth == 24){ 图像 = 新的缓冲图像(宽度、高度、BufferedImage.TYPE_INT_RGB); } 可写栅格栅格 = (可写栅格) image.getData(); raster.setPixels(0, 0, width, height, pixels); image.setData(raster); 返回getBufferedImageToBmpByteArray(image); } private byte[] getBufferedImageToBmpByteArray(BufferedImage image) { 字节[] 图像数据 = 空; 尝试 { ByteArrayOutputStream bas = new ByteArrayOutputStream(); ImageIO.write(image, "bmp", bas); imageData = bas.toByteArray(); bas.close(); } catch (Exception e) { e.printStackTrace(); } 返回图像数据; } private int[] byteToInt(byte[] data) { int[] ints = new int[data.length]; for (int i = 0; i
您需要将

三个字节打包到您创建的每个整数中。 根据缓冲图像的格式,这将是 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()

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

最新更新