将信息存储在PNG文件中而不会使图像失真吗?

时间:2019-02-15 19:47:45

标签: java png

我想将信息(以前是int / String)写到一个PNG文件中,而不会使更改对人眼可见。

为了实现这一点,我以字节数组的形式提取了文件:

byte[] imageAsBytes = fileInputStream.readAllBytes();

在下一步中,我跳过标题(8字节,已经尝试达到300字节)。我已经处理了信息,可以按位提取信息。

我将图片字节中的最后一位替换为按位提取的信息。

这与.bmp文件格式配合使用效果很好,但是将此技术应用于PNG文件会使图像失真。

我的猜测是PNG文件在标头之后包含其他信息。

那么在标头之后是否存储了任何信息?如果是的话,什么将这个“信息部分”标记为一个?

2 个答案:

答案 0 :(得分:0)

我认为最好的方法不是看文件字节,而是用一些png解码器打开它,然后更改其图像的像素,然后使用png再次保存。当您确定自己将使用文件字节本身玩耍时,肯定会破坏png的格式时,您并没有在bmp中使用,因为bmp的jsut像素逐像素地直接保存到文件中,而没有任何包装或编码

答案 1 :(得分:0)

为了读取和解码.png文件,我们可以使用BufferedImage,如下所示:

File imageFile = new File("myimage.png");
BufferedImage image = ImageIO.read(imageFile);

否,我们无法使用getRGBsetRGB方法来操纵其像素:

int pixel = image.getRGB(x, y);
// do some byte manipulation on the pixel
// ....
image.setRGB(x, y, pixel);

此后,BufferedImage应该通过管道传递到输出流,以便能够保存新图像。