首页 > IT职业 > IT职场 > 【Python学习笔记】图片中隐藏信息——图片隐写术
图片是由一个个像素组成的。每个像素由一组(r,g,b)值表示(png格式图片,多一个alpha透明度值)。而对于单个r,g或b,其范围在0~255之间,可由一个字节(8位表示)。因此,当改变最低位的值时,对于整个图片来说,其视觉效果通过肉眼看不出来的。比如一组颜色白色(255,255,255),变为(254,255,255)时,是看不出来变化的。
因此,可将一组待隐藏信息转换为二进制后,再将每个二进制码存储在图片的像素中。

原图片.png

隐藏有信息后的图片.png
获取原图片像素(list)
使像素最低位变为偶数
待隐藏信息转换为二进制,并且对于单字节字符,当位数不够8时,在最高位补0
将二进制的待隐藏信息依次与图片中每个像素的r、g、b进行相加
获取隐藏有信息的图片的像素(list)
获取像素值的最低位(隐藏的信息存储位置)
获取存储的信息的二进制值
按每8位为一组,将上述二进制转换为十进制形式
采用chr函数,将十进制转为字符并存储到字符串中
# -*- coding: utf-8 -*-from PIL import Imageimport sys
reload(sys)
sys.setdefaultencoding('utf8')
"""
取得一个 PIL 图像并且更改所有值为偶数(使最低有效位为 0)
"""def makeImageEven(image):
pixels = list(image.getdata()) # 得到一个这样的列表: [(r,g,b,t),(r,g,b,t)...]
evenPixels = [(r>>1>1>1>1 len(image.getdata()) * 4: # 如果不可能编码全部数据, 抛出异常
raise Exception("Error: Can't encode more than " + len(evenImage.getdata()) * 4 + " bits in this image. ")
encodedPixels = [(r+int(binary[index*4+0]),g+int(binary[index*4+1]),b+int(binary[index*4+2]),t+int(binary[index*4+3])) if index*4 >1>1>1>1参考来源
https://www.shiyanlou.com/courses/651
作者:八月之雨
链接:https://www.jianshu.com/p/72f0d0953ca4
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/3370/viewspace-2809907/ ,如需转载,请注明出处,否则将追究法律责任。