我想将信息(以前是int / String)写到一个PNG文件中,而不会使更改对人眼可见。
为了实现这一点,我以字节数组的形式提取了文件:
byte[] imageAsBytes = fileInputStream.readAllBytes();
在下一步中,我跳过标题(8字节,已经尝试达到300字节)。我已经处理了信息,可以按位提取信息。
我将图片字节中的最后一位替换为按位提取的信息。
这与.bmp文件格式配合使用效果很好,但是将此技术应用于PNG文件会使图像失真。
我的猜测是PNG文件在标头之后包含其他信息。
那么在标头之后是否存储了任何信息?如果是的话,什么将这个“信息部分”标记为一个?
答案 0 :(得分:0)
我认为最好的方法不是看文件字节,而是用一些png解码器打开它,然后更改其图像的像素,然后使用png再次保存。当您确定自己将使用文件字节本身玩耍时,肯定会破坏png的格式时,您并没有在bmp中使用,因为bmp的jsut像素逐像素地直接保存到文件中,而没有任何包装或编码
答案 1 :(得分:0)
为了读取和解码.png文件,我们可以使用BufferedImage
,如下所示:
File imageFile = new File("myimage.png");
BufferedImage image = ImageIO.read(imageFile);
否,我们无法使用getRGB
和setRGB
方法来操纵其像素:
int pixel = image.getRGB(x, y);
// do some byte manipulation on the pixel
// ....
image.setRGB(x, y, pixel);
此后,BufferedImage
应该通过管道传递到输出流,以便能够保存新图像。