Я делаю стеганографический проект для удовольствия в 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)
Заранее спасибо за любую помощь!