Функция сокрытия текста в изображении 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Функция сокрытия текста в изображении



Данная функция принимает на вход следующие значения:

input_img_name - имя 24-битного исходного изображения BMP

output_img_name - имя 24-битного изображения в кодировке BMP (будет создано или перезаписано)

txt_file - имя файла, содержащего текст для кодирования в output_img

degree - количество битов из байта (1/2/4/8), которые используются для кодирования текстовых данных в изображении.

Функция возвращает истину, если функция завершается успешно, иначе ложь

def encode_image(input_img_name, output_img_name, txt_file, degree):

if degree not in [1, 2, 4, 8]: # Проверка на соответствие количества #битов из байта, которые используются для кодирования текстовых данных в #изображении. При несоответствии данного параметра с требуемым (1/2/4/8), #функция завершается, возвращая ложь.

   print("Количесво зашиваемых бит должно быть равно 1 / 2 / 4 / 8")

   return False

text_len = os.stat(txt_file).st_size # Размер текстового файла

print(f"Длина зашиваемого сообщения - {text_len}")

img_len = os.stat(input_img_name).st_size # Размер контейнера-#изображения

if text_len >= img_len * degree / 8 - BMP_HEADER_SIZE: # Сравнение #размера текстового файла и размера контейнера-изображения. Если размер #текстового файла превышает размер контейнера изображения, поделенного #на отношения требуемого количества бит в 1 байте к 8, с вычетом заголовка #контейнера-изображения (54 первых бит), функция завершается, возвращая #ложь.

   print("Размер текста слишком большой для данной картинки ")

   return False

text = open(txt_file, 'r') # Открытие текстового файла для чтения

input_image = open(input_img_name, 'rb') # Открытие контейнера-#изображения для побайтового чтения.

output_image = open(output_img_name, 'wb') # Открытие контейнера-#изображения для побайтовой записи.

bmp_header = input_image.read(BMP_HEADER_SIZE) # чтение #заголовка оригинального изображения

output_image.write(bmp_header) # запись заголовка в новое #изображение

text_mask, img_mask = create_masks(degree) # создание битовой маски

while True:

   symbol = text.read(1) # чтение 1 символа текста

   if not symbol: # при достижении конца файла

       symbol = ord("\0") # возвращение кодового значение нуль байта

       for byte_amount in range(0, 8, degree):

           img_byte = int.from_bytes(input_image.read(1), sys.byteorder) & img_mask # чтение 1 байта контейнера изображения и добавление к нему #маски путем логического умножения (операцией И)

           bits = symbol & text_mask # получение degree бит из символа

           bits >>= (8 - degree) # логически сдвигаем биты символа

           img_byte |= bits # помещаем биты в байт изображения #операцией логического сложения (операция или)

           output_image.write(img_byte.to_bytes(1, sys.byteorder)) # запись #измененного байта в изображение.

           symbol <<= degree # логический сдвиг символа на degree для #возможности возврата остальных битов символа

       break

   symbol = ord(symbol) # возвращение кодового значение #прочитанного символа

   for byte_amount in range(0, 8, degree):

       img_byte = int.from_bytes(input_image.read(1), sys.byteorder) & img_mask # чтение 1 байта контейнера изображения и добавление к нему #маски путем логического умножения (операцией И)

       bits = symbol & text_mask # получение degree бит из символа

       bits >>= (8 - degree) # логически сдвигаем биты символа

       img_byte |= bits # помещаем биты в байт изображения операцией #логического сложения (операция или)

       output_image.write(img_byte.to_bytes(1, sys.byteorder)) # запись #измененного байта в изображение.

       symbol <<= degree # логический сдвиг символа на degree для #возможности возврата остальных битов символа

output_image.write(input_image.read()) # переписывание оставшихся #бит оригинального изображения в новое изображение

text.close() # закрытие текстового файла

input_image.close() # закрытие оригинального изображения

output_image.close() # закрытие нового изображения

return True

 



Поделиться:


Последнее изменение этой страницы: 2021-07-19; просмотров: 20; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.140.242.165 (0.005 с.)