まず、いくつかの重要な機能を定義します
1.エンコード機能:段落を2進数にエンコードし、リストに保存します。2進数のリストと、このリストの行数、および各行に対応する列数を返します。
def encode(s): #编码函数
n=len(s)
l=list() #编码数组
num=list()
k=0 #记录数组中字符的个数
for i in range(n):
l.append([])
num.append(len(s[i]))
for j in range(len(s[i])):
l[i].append(bin(ord(s[i][j])).replace('0b',''))
return l,num
2.デコード機能:格納されている2進数のリストを段落にデコードします。デコードされた文字列を返します。
def decode(l): #解码函数
s=list()
for i in range(len(l)):
s.append([])
s[i]=''.join(chr(k) for k in [int(j,2) for j in l[i]])
return s
3.情報隠蔽機能:画像と2進数のリストを指定して、画像のピクセルに対応する2進数の最後の桁の2進数のリストに各2進数を格納します。ピクセルは3ビットと7を格納できます-ビット番号。バイナリを格納するには3ピクセルが必要です。情報を隠して写真を返します。
def hide(pic,en): #将已解码的字符串中的信息隐藏进图片
pic=Image.open(pic).convert('RGB') #将4通道RGBA像素转化为3通道RGB像素
np=numpy.array(pic)
long,width,dim=np.shape
pic_array=np
m=0 #记录赋值次数
for i in range(len(en)):
for j in range(len(en[i])*3):
for k in range(dim):
s=bin(pic_array[i][j][k]).replace('0b','')
pic_array[i][j][k]=int(s[:-2]+en[i][j//3][m])
m=(m+1)%7
if m==0:
break
pic.close()
return Image.fromarray(pic_array)
4.情報抽出機能:画像とレコード文字列のリストの場合、指定した位置のピクセルに対応する2進数の最後のビットを抽出し、記録された情報に従って完全な2進数に接続します。 2進数リストのデコードされた情報。
def extract(pic,num):
l=list()
np=numpy.array(pic)
m=0
for i in range(len(num)):
l.append([])
for j in range(num[i]*3):
if j%3==0:
l[i].append([])
for k in range(3): #dim=3
s=bin(np[i][j][k]).replace('0b','')
l[i][j//3]+=s[-1:]
m=(m+1)%7
if m == 0:
l[i][j//3]=''.join(l[i][j//3])
break
return decode(l)
上記の機能により、この問題は基本的に解決されました。プログラムのインタラクティブな部分です。
sentence=list(map(str,input('请输入一个句子:').split()))
en,num=encode(sentence)
print('编码后的字符串为:',en,num)
pic=hide('tree',en)
pic.show('隐藏信息的图片:')
print(' '.join(extract(pic,num)))
入る:
unknown person loves cs
出力:
请输入一个句子:unkonwn person loves cs
编码后的字符串为: [['1110101', '1101110', '1101011', '1101111', '1101110', '1110111', '1101110'], ['1110000', '1100101', '1110010', '1110011', '1101111', '1101110'], ['1101100', '1101111', '1110110', '1100101', '1110011'], ['1100011', '1110011']] [7, 6, 5, 2]
unkonwn person loves cs