85 lines
2.7 KiB
Python
85 lines
2.7 KiB
Python
|
# -*- coding: utf-8 -*-
|
|||
|
"""
|
|||
|
Created on Sun May 19 11:20:05 2019
|
|||
|
|
|||
|
@author: Administrator
|
|||
|
"""
|
|||
|
|
|||
|
from PIL import Image
|
|||
|
|
|||
|
|
|||
|
def plus(string):
|
|||
|
#Python zfill() 方法返回指定长度的字符串,原字符串右对齐,前面填充0。
|
|||
|
return string.zfill(8)
|
|||
|
|
|||
|
def get_key(strr):
|
|||
|
#获取要隐藏的文件内容
|
|||
|
with open(strr,"rb") as f:
|
|||
|
s = f.read()
|
|||
|
string=""
|
|||
|
for i in range(len(s)):
|
|||
|
#逐个字节将要隐藏的文件内容转换为二进制,并拼接起来
|
|||
|
#1.先用ord()函数将s的内容逐个转换为ascii码
|
|||
|
#2.使用bin()函数将十进制的ascii码转换为二进制
|
|||
|
#3.由于bin()函数转换二进制后,二进制字符串的前面会有"0b"来表示这个字符串是二进制形式,所以用replace()替换为空
|
|||
|
#4.又由于ascii码转换二进制后是七位,而正常情况下每个字符由8位二进制组成,所以使用自定义函数plus将其填充为8位
|
|||
|
string=string+""+plus(bin(s[i]).replace('0b',''))
|
|||
|
#print(string)
|
|||
|
return string
|
|||
|
|
|||
|
def mod(x,y):
|
|||
|
return x%y
|
|||
|
|
|||
|
#str1为载体图片路径,str2为隐写文件,str3为加密图片保存的路径
|
|||
|
def func(str1,str2,str3):
|
|||
|
im = Image.open(str1)
|
|||
|
#获取图片的宽和高
|
|||
|
width,height= im.size[0],im.size[1]
|
|||
|
print("width:"+str(width))
|
|||
|
print("height:"+str(height))
|
|||
|
count = 0
|
|||
|
#获取需要隐藏的信息
|
|||
|
key = get_key(str2)
|
|||
|
keylen = len(key)
|
|||
|
for h in range(height):
|
|||
|
for w in range(width):
|
|||
|
pixel = im.getpixel((w,h))
|
|||
|
a=pixel[0]
|
|||
|
b=pixel[1]
|
|||
|
c=pixel[2]
|
|||
|
if count == keylen:
|
|||
|
break
|
|||
|
#下面的操作是将信息隐藏进去
|
|||
|
#分别将每个像素点的RGB值余2,这样可以去掉最低位的值
|
|||
|
#再从需要隐藏的信息中取出一位,转换为整型
|
|||
|
#两值相加,就把信息隐藏起来了
|
|||
|
a= a-mod(a,2)+int(key[count])
|
|||
|
count+=1
|
|||
|
if count == keylen:
|
|||
|
im.putpixel((w,h),(a,b,c))
|
|||
|
break
|
|||
|
b =b-mod(b,2)+int(key[count])
|
|||
|
count+=1
|
|||
|
if count == keylen:
|
|||
|
im.putpixel((w,h),(a,b,c))
|
|||
|
break
|
|||
|
c= c-mod(c,2)+int(key[count])
|
|||
|
count+=1
|
|||
|
if count == keylen:
|
|||
|
im.putpixel((w,h),(a,b,c))
|
|||
|
break
|
|||
|
if count % 3 == 0:
|
|||
|
im.putpixel((w,h),(a,b,c))
|
|||
|
im.save(str3)
|
|||
|
|
|||
|
def main():
|
|||
|
#原图
|
|||
|
old = "old.png"
|
|||
|
#处理后输出的图片路径
|
|||
|
new = "new.png"
|
|||
|
#需要隐藏的信息
|
|||
|
enc = "flag.txt"
|
|||
|
func(old,enc,new)
|
|||
|
|
|||
|
if __name__=='__main__':
|
|||
|
main()
|