【问题标题】:How to convert a byte array into a PNG image?如何将字节数组转换为 PNG 图像?
【发布时间】:2016-04-03 18:10:04
【问题描述】:

如何将字节数组转换为 PNG 图像(不是 JPEG)?我知道这个过程需要转换为 BufferedImage 作为一个步骤。

我在编写隐写术时遇到了这个问题。

【问题讨论】:

  • 你的字节是灰度还是 RGB24?
  • 您使用哪种语言? Java有很好的文件图片转换和编写库。
  • 您能否确认您正在使用 Java?您提到了 BufferedImage。你真的搜索过 BufferedImage 的字节数组吗?如果你没有得到任何结果,我会感到惊讶。 stackoverflow.com/questions/12705385/…
  • 是的,我正在使用 java。我已经能够将字节数组转换为 BufferedImage 但无法将其保存为 png。我的字节数组的大小是 1316890,宽度 = 1024,高度 = 768。我使用的图像是vignette3.wikia.nocookie.net/pokemon/images/b/b4/…

标签: java png bufferedimage


【解决方案1】:

假设您有一个长度 = (图像宽度 * 图像高度 * 3) 的字节数组。首先我们将数据打包成一个 BufferedImage:

import java.awt.BufferedImage;
byte[] b = (...);
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        int off = (y * width + x) * 3;
        int pix = (b[off] & 0xFF) << 16;  // Red component
        pix |= (b[off + 1] & 0xFF) << 8;  // Green component
        pix |= (b[off + 2] & 0xFF) << 0;  // Blue component
        img.setRGB(x, y, pix);
    }
}

然后我们编写PNG图像文件:

import javax.imageio.ImageIO;
ImageIO.write(img, "png", new File("output.png"));

【讨论】:

  • 我试过你的代码,但它没有停止。我所有的细节是:我的字节数组的大小是 1316890,宽度 = 1024 和高度 = 768。我使用的图像是vignette3.wikia.nocookie.net/pokemon/images/b/b4/…
  • 我的循环确实正确终止。你的意思是它没有停止?请告诉我你正在运行什么代码以及你观察到什么行为
  • 现在我稍微更正了我的代码,我得到了“ArrayIndexOutOfBound”异常。从初始图像的 BufferedImage 获得的宽度和高度分别为 1024 和 768,当我将该 BufferedImage 转换为字节数组时,数组的大小为 1316890。现在我想将字节数组转换回 png 图像。在使用您的代码时,我得到了上面提到的异常。
  • 为什么你的数组是 1316890 字节?这与 1024×768 的尺寸有什么关系?
  • 经过一些调试,我发现了我从自己的代码中得到的错误。 Nayuki 妈妈,如果你能看看我新发布的问题stackoverflow.com/questions/36407866/…,那将是一个很大的帮助。这将是一个很大的帮助。谢谢你
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 2019-11-08
  • 2016-07-24
  • 2011-04-17
相关资源
最近更新 更多