如何将PNG图片隐写实例中的二维码改为?

摘要:图片隐写,借助的是图片的每个像素点的RGB值,比如取RGB中的B值,这个值的二级制的最低位是0还是1,在肉眼上看看不出丝毫区别,我们就可以利用这个数据位,我们知道二维码一般都是两种颜色,黑色和白色,黑色的像素点用1表示,白色用0表示,我们就
图片隐写技术介绍: 【如何在图片中塞入二维码不被发现】 https://www.bilibili.com/video/BV12R4y1G72d/?share_source=copy_web&vd_source=d944df449598b7e51bbc29cddb033275 png图片格式介绍: https://www.cnblogs.com/senior-engineer/p/9548347.html https://zhuanlan.zhihu.com/p/23890809 图片隐写,借助的是图片的每个像素点的RGB值,比如取RGB中的B值,这个值的二进制的最低位是0还是1,在肉眼上看看不出丝毫区别,我们就可以利用这个数据位,我们知道二维码一般都是两种颜色,黑色和白色,黑色的像素点用1表示,白色用0表示,我们就把二维码的每个像素点转换成1和0,在把这些1和0存到承载二维码的本体图片的像素的一个颜色值通道的二进制值的最低位上。这就是大概原理。 如果要从载体图片读取二维码,需要知道二维码的长和宽,以便读取正确的二维码的1和0值,然后在把1和0反转成黑色或白色,就能解析出构成二维码了。所以我们需要把二维码的长和宽写入到载体图片中。 这就需要png格式的图片一定是要符合png的标准,否则在这一步会让图片损坏。要辨别png格式,不能只看文件的扩展名为png,需要看文件的署名是否是png规定的署名。符合png标准的png的文件用二进制编辑器打开,最开始的8个字节一定是:0x89 0x50 0x4e 0x47 0x0d 0x0a 0x1a 0x0a。只有先确认了这样的字节,才能进行接下来的步骤。 我们需要把二维码图片的长和宽的值写入png文件中,借助png的辅助数据块的格式tEXt,可以实现该目的。我们还需要知道一个IEND数据块,它一定是位于png二进制文件的最后,数据格式是固定的{x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82}。知道这些,我们就可以把tExt块写入iEND块之前。为了后续读取这个tExt块,需要把tExt的块的数据区域的最后一个位置写成整个tExt块数组的长度。具体看代码。 这就是我对实现png格式图片隐写二维码的总结。 扩展:处理隐藏二维码,其实还可以把一些数据编码成二进制也是可以隐藏这些信息的。RGB三个通道都可以同时做这样的写值处理。如果二维码不只是两种颜色,而且想要还原的时候保持与原二维码图一致的话,我的思路是,隐写二维码的像素点的颜色值前23位,载体的每个像素的RGB值的最低位按顺序写入二维码的23个二进制,这要求载体图片的长和宽大概是二维码图片的长和宽的8倍甚至更多,思路是一样的,只不过解析的时候,需要做像素之间的对应关系。 全部代码:代码中的路径使用了硬编码,如果需要运行代码,要自己准备图片和改路径名称。
阅读全文