尝试在图像隐写术中解码时出错

问题描述 投票:0回答:1

我正在尝试使用python进行图像隐写术项目,并且我使用下面的代码对图像中的消息进行加密和解密。我能够进行编码,但在解码时却无法获得我在解码时使用的正确值。这是我用于图像隐写术的程序

from PIL import Image 
def genData(data): 

        # list of binary codes 
        # of given data 
        newd = []  

        for i in data: 
            newd.append(format(ord(i), '08b')) 
        return newd 

# Pixels are modified according to the 
# 8-bit binary data and finally returned 
def modPix(pix, data): 

    datalist = genData(data) 
    lendata = len(datalist) 
    imdata = iter(pix) 

    for i in range(lendata): 

        # Extracting 3 pixels at a time 
        pix = [value for value in imdata.__next__()[:3] +
                                  imdata.__next__()[:3] +
                                  imdata.__next__()[:3]] 

        # Pixel value should be made  
        # odd for 1 and even for 0 
        for j in range(0, 8): 
            if (datalist[i][j]=='0') and (pix[j]% 2 != 0): 

                if (pix[j]% 2 != 0): 
                    pix[j] -= 1

            elif (datalist[i][j] == '1') and (pix[j] % 2 == 0): 
                pix[j] -= 1

        # Eigh^th pixel of every set tells  
        # whether to stop ot read further. 
        # 0 means keep reading; 1 means the 
        # message is over. 
        if (i == lendata - 1): 
            if (pix[-1] % 2 == 0): 
                pix[-1] -= 1
        else: 
            if (pix[-1] % 2 != 0): 
                pix[-1] -= 1

        pix = tuple(pix) 
        yield pix[0:3] 
        yield pix[3:6] 
        yield pix[6:9] 

def encode_enc(newimg, data): 
    w = newimg.size[0] 
    (x, y) = (0, 0) 

    for pixel in modPix(newimg.getdata(), data): 

        # Putting modified pixels in the new image 
        newimg.putpixel((x, y), pixel) 
        if (x == w - 1): 
            x = 0
            y += 1
        else: 
            x += 1

# Encode data into image 
def encode(): 
    img = input("Enter image name(with extension): ") 
    image = Image.open(img, 'r') 

    data = input("Enter data to be encoded : ") 
    if (len(data) == 0): 
        raise ValueError('Data is empty') 

    newimg = image.copy() 
    encode_enc(newimg, data) 

    new_img_name = input("Enter the name of new image(with extension): ") 
    newimg.save(new_img_name, str(new_img_name.split(".")[1].upper())) 

# Decode the data in the image 
def decode(): 
    img = input("Enter image name(with extension) :") 
    image = Image.open(img, 'r') 

    data = '' 
    imgdata = iter(image.getdata()) 

    while (True): 
        pixels = [value for value in imgdata.__next__()[:3] +
                                  imgdata.__next__()[:3] +
                                  imgdata.__next__()[:3]] 
        # string of binary data 
        binstr = '' 

        for i in pixels[:8]: 
            if (i % 2 == 0): 
                binstr += '0'
            else: 
                binstr += '1'

        data += chr(int(binstr, 2)) 
        if (pixels[-1] % 2 != 0): 
            return data 

# Main Function         
def main(): 
    a = int(input(":: Welcome to Steganography ::\n"
                        "1. Encode\n 2. Decode\n")) 
    if (a == 1): 
        encode() 

    elif (a == 2): 
        print("Decoded word- " + decode()) 
    else: 
        raise Exception("Enter correct input") 

# Driver Code 
if __name__ == '__main__' : 

    # Calling main function 
    main() 

编码输出

:: Welcome to Steganography ::
1. Encode
 2. Decode
1
Enter image name(with extension): stegpic.jpg
Enter data to be encoded : sdfghj
Enter the name of new image(with extension): stegg.JPEG

解码输出:

:: Welcome to Steganography ::
1. Encode
 2. Decode
2
Enter image name(with extension) :stegg.JPEG
Decoded word- ÿ
python steganography
1个回答
-1
投票
在此获取可用的源代码Source code of steganography
© www.soinside.com 2019 - 2024. All rights reserved.