修改PNG文件的一个字节[关闭]
Posted
技术标签:
【中文标题】修改PNG文件的一个字节[关闭]【英文标题】:Modify one byte of PNG file [closed] 【发布时间】:2021-12-30 19:47:21 【问题描述】:对于我的学习项目,我需要修改 png 文件中的一些字节。
用于隐写术项目,我必须稍微修改一个字节并在照片中隐藏一条消息。
在下面的代码中,当我运行它时,它会将每个字节都变为 0 并且文件粉碎。在 bmp 文件中它可以工作,但我不知道如何在 png 格式中做到这一点。
很遗憾,我无法使用任何第三方库。我只需要一种正确读取每个字节的方法的帮助,然后使用 C++ 对其进行修改。感谢您的帮助。
string path = "C:\\Users\\sth....";
fstream file(path, ios::binary | ios::in | ios::out);
char buffer[1000];
file.seekp(300);
file << char(0);
file.read(buffer, 1000);
for(char c : buffer)
cout << int(c) << " ";
【问题讨论】:
它用于隐写术项目,我必须稍微修改一个字节并在照片中隐藏一条消息,因为您很可能需要使用png 库。 更改 png 文件中的随机字节将损坏整个 png 图像(正如您已经发现的那样,这是一种艰难的方式)。安全修改图像的唯一方法是 1) 将 png 转换为“原始像素”数组,2) 对原始像素执行修改,最后 3) 将像素转换回 png。完成步骤 1) 和 3) 的最简单方法是使用 .png 库。 STB 有用于简单读取和写入 PNG(以及其他图像格式)的例程:github.com/nothings/stb LodePNG 是另一个:lodev.org/lodepng 除了 png 问题:fstream
只有一个文件位置,用于任一读取或写入。所以每次你从阅读变成写作,反之亦然,你都必须寻找到正确的位置。
写入完成后关闭文件?
【参考方案1】:
png 文件格式使用压缩,因此直接在文件的二进制级别更改字节肯定会导致图像损坏。
您需要将 png 文件格式转换为实际像素值并在此处应用隐写术。
BMP 通常未压缩存储,因此可以直接在文件的二进制级别上工作。然而,情况并非总是如此,因为 BMP 还支持 RLE 形式的压缩。
【讨论】:
如何改变头部中的一个字节? @Sebastian 是的,您可以这样做,但是您仍然需要执行一些解析并根据从解析中获得的信息应用隐写术。盲目地将此类更改应用于二进制文件总是有问题的。以上是关于修改PNG文件的一个字节[关闭]的主要内容,如果未能解决你的问题,请参考以下文章