Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Функция сокрытия текста в изображении
Данная функция принимает на вход следующие значения: 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 с.) |