我们知道图像隐写常用的方法是在图片的每个像素的字节低位(LSB)做文章。
png图像有RGBA四个通道,其中A是Alpha,指透明度。用Alpha通道做隐写有两个方法:
- Alpha通道数值设为0(完全透明),然后在RGB上随便写,图片也是透明的。
- 在Alpha通道的字节低位做文章,例如用最后一位0/1来存信息,相应位置透明度产生微小变化人眼看不出来。
分享一个第2种方法的python实现:
1. 准备原始图片(yxorigin.png),需要隐写的图片们(yxtext.png, yxtext2.png).如下:
然后用以下代码依次将两个文字图片隐写到原图的字节最后一位和倒数第二位,代码中是最后一位(“11111110”)。图片读入后以h*w*c矩阵形式存储,其中c是通道数,代表RGBA四个通道。隐写方法是将“yxtext.png”图片的Red通道im_aplha[:,:,0]修改后盖在原图的Alpha通道im[:,:,3]上。
import os,sys
from skimage import io
image_list=[(io.imread("yxorigin.png"),io.imread("yxtext.png"),"yxoutput.png")]
for im,im_alpha,_ in image_list:
alpha=im_alpha[:,:,0].copy()
alpha[alpha<255]=int("11111110",2)
im[:,:,3]&=alpha[:,:]
for im,_,filename in image_list:
io.imsave(filename,im)
得到隐写成功的图如下,人眼几乎看不出来和原图的区别。
不过我们可以借助工具(Stegsolve)查看,我们查看图像的Aplha plane 1 和Aplha plane 0,可以看到我们隐写的内容,如下:
以上。