Значения RGB изображения не совпадают с установленными ими - PullRequest
0 голосов
/ 29 августа 2018

Я делаю стеганографический проект для удовольствия в Python 3.7. Кажется, мой кодировщик работает нормально (насколько я могу судить), но мой декодер доставляет мне некоторые проблемы. Всякий раз, когда я пытаюсь декодировать строку из изображения, она выводит странные символы. Из проведенного мною тестирования кажется, что проблема заключается в том, что значения RGB каждого пикселя на выходе моего кодера не совпадают со значениями импорта моего декодера (что странно, поскольку я установил их одинаковыми файл). Не могли бы вы, ребята, помочь мне исправить это, чтобы вход моего декодера был таким же, как и выход моего кодера?

Вот мой код (извините за плохой код без комментариев, я так сильно изменил свой код, что забыл добавить их обратно):

    from PIL import Image


def write_message(message_to_encode, cover_image, output_file):

    cover_image = Image.open(cover_image)
    red_split = cover_image.split()[0]
    green_split = cover_image.split()[1]
    blue_split = cover_image.split()[2]

    x_size = cover_image.size[0]
    y_size = cover_image.size[1]
    binary_message = ''.join('{:08b}'.format(ord(c)) for c in message_to_encode)
    count = 0
    encoded_image = Image.new('RGB', cover_image.size)
    pixel = encoded_image.load()
    for i in range(x_size):
        for j in range(y_size):
            red_split_pix = bin(red_split.getpixel((i, j)))

            if count < len(binary_message):
                red_split_pix = red_split_pix[:-1] + binary_message[count]
                count = count + 1
            else:
                red_split_pix = red_split_pix[:-1] + '0'
            pixel[i, j] = (int(red_split_pix, 2), green_split.getpixel((i, j)), blue_split.getpixel((i, j)))

    cover_image.close()
    encoded_image.save(output_file)
    encoded_image.close()


def decoder(encoded_file):
    encoded_image = Image.open(encoded_file)
    red_split = encoded_image.split()[0]
    x_size = encoded_image.size[0]
    y_size = encoded_image.size[1]
    n = []
    m = ''
    count = 0
    for i in range(x_size):
        for j in range(y_size):
            n.append(bin(red_split.getpixel((i, j)))[-1])

    for l in range(count, count + 7):
        if n[l] == 0 and n[l+1] == 0 and n[l+2] == 0 and n[l+3] == 0 and n[l+4] == 0 and n[l+5] == 0 and n[l+6] == 0 \
                and n[l+7] == 0:
            count = count + 8
        else:
            m += str(n[count])
            m += str(n[count+1])
            m += str(n[count+2])
            m += str(n[count+3])
            m += str(n[count+4])
            m += str(n[count+5])
            m += str(n[count+6])
            m += str(n[count+7])

            count = count + 8

    secret = ''.join(chr(int(m[i:i+8], 2)) for i in range(0, len(m), 8))
    print(secret)
    encoded_image.close()


message = "hello how are you"
template_image = 'C:/Users/andys/Documents/Programming/IDE Workspace/Python/Image Coding/test images/hiker.jpg'
encrypted_image = 'C:/Users/andys/Documents/Programming/IDE Workspace/Python/Image Coding/output/Encoded_output.jpg'

write_message(message, template_image, encrypted_image)

decoder(encrypted_image)

Заранее спасибо за любую помощь!

...