英語の文字列情報を画像にエンコードし、情報をデコードします

まず、いくつかの重要な機能を定義します

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

 

おすすめ

転載: blog.csdn.net/jccc39/article/details/106188173