Лабораторная работа №3 Дешифровка текста из изображения

Цель:

  1. Закрепить навыки разработки программ использующих операторы цикла;
  2. Закрепить навыки разработки программ использующих массивы;
  3. Освоить методы подключения сторонних библиотек.

Постановка задачи

Напишите на языке С++ программу, которая по заданному изображению и ключу восстанавливает исходное текстовое сообщение (Си-строка) зашифрованное в изображении.

Ход работы

  1. Для работы с изображениями в формате bmp скачайте библиотеку https://github.com/marc-q/libbmp.
  2. В скаченном репозитории найдите папку CPP, в ней расположены файлы которые нужно подключить к своему проекту, а так же пример использования библиотеки.
  3. Файл libbmp.cpp скопируйте в папку проекта и добавьте к проекту, как показано на Рис.1
    Лабораторная работа №3  Дешифровка текста из изображения
    Рис. 1. Добавление *.сpp файла к проекту
  4. В папке с проектом создайте папку include и скопируйте туда libbmp.h
  5. Переходим в «Обозреватель решений» > кликаем правой кнопкой мыши (ПКМ) по названию проекта > «Свойства» (Рис.2).
    Лабораторная работа №3  Дешифровка текста из изображения
    Рис. 2. Как открыть свойства проекта
  6. В «Свойствах конфигурации» открываем вкладку «С/С++» > «Общие» > «Дополнительные каталоги включаемых файлов» > нажимаем на стрелочку в конце > «Изменить»:
    Лабораторная работа №3  Дешифровка текста из изображения
    Рис. 3. Свойства проекта
  7. В появившемся окне кликаем на иконку с изображением папки, а затем на появившееся троеточие:
    Лабораторная работа №3  Дешифровка текста из изображения
    Рис. 4. Дополнительные каталоги включаемых файлов
  8. Заголовочные файлы находятся в папке include внутри нашего проекта, поэтому переходим в неё и нажимаем «Выбор папки», а затем «Ок». В примере фалы находятся в папке (C:\Libs\SDL2-2.0.9\include)
    Лабораторная работа №3  Дешифровка текста из изображения
    Рис. 5. Путь к каталогу включаемых файлов
  9. Теперь можно подключить библиотеку в свой проект. Для этого добавьте в главный файл вашей программы строку (после iostream):
  10. В соответствии с вашим вариантом выберите из таблице 1 ссылку на картинку и ключ. Номер варианта соответствует номеру в журнале академической группы. Картинка весит около 1 МБ.
  11. Декодируйте сообщение и выведите его в консоль.
  12. В отчёт необходимо включить:
    • Исходное изображение и ключ;
    • Код программы для декодирования сообщения;
    • Декодированное сообщение.

Таблица 1

Ссылка на изображениеКлюч
1Картинка11r 11g 11b 01r 01g 01b 10r 10g
2Картинка00r 00g 00b 10r 10g 10b 01r 01g
3Картинка00r 00g 00b 01r 01g 01b 10r 10g
4Картинка11r 11g 11b 10r 10g 10b 01r 01g
5Картинка11r 11b 11g 01r 01b 01g 10r 10b
6Картинка00r 00b 00g 10r 10b 10g 01r 01b
7Картинка00r 00b 00g 01r 01b 01g 10r 10b
8Картинка11r 11b 11g 10r 10b 10g 01r 01b
9Картинка11b 11g 11r 01b 01g 01r 10b 10g
10Картинка00b 00g 00r 10b 10g 10r 01b 01g
11Картинка00b 00g 00r 01b 01g 01r 10b 10g
12Картинка11b 11g 11r 10b 10g 10r 01b 01g
13Картинка11g 11b 11r 01g 01b 01r 10g 10b
14Картинка00g 00b 00r 10g 10b 10r 01g 01b
15Картинка00g 00b 00r 01g 01b 01r 10g 10b

Пояснение к кодированию и ключу

Текст представляет из себя обычную Си-строку, то есть последовательность байт, с завершающим нулевым символом.

Каждый байт это набор из восьми бит в порядке слева на право от старшего к младшему, т.е. старший бит слева.

Итого, исходный текст представляется в виде последовательности бит.

Изображение представляется в виде двумерной матрицы, элементом которой является пиксель. Цвет пикселя определяется тремя каналами R(red), G(green), B(Blue). Каждый из каналов задаётся числом в диапазоне [0..255].

Лабораторная работа №3  Дешифровка текста из изображения

Рис. 6. Представление цвета пикселя в виде разложения по каналам RGB

Координаты каждого пикселя определяются парой чисел X и Y. Начало отсчёта расположено в левом верхнем углу, X начинается с нуля и увеличивается слева на право, Y увеличивается сверху вниз.

Лабораторная работа №3  Дешифровка текста из изображения

Рис. 7. Координатная сетка

Ключ — последовательность из восьми триплетов. Каждая триплет ключа задаётся в формате: X-координата Y-координата Канал (r, g или b) и определяет координаты места в изображении, в которое будет помещён очередной бит текста.

Ключ показывает, в какие координаты (X, Y, Канал) изображения попали бы 8 первых бит текста, если бы они кодировались в изображение 2Х2 пикселя.

Для вышеуказанного ключа и «изображения» 2Х2 биты будут помещаться в следующем порядке:

Для вышеуказанного ключа и «изображения» 3Х3 биты будут помещаться в следующем порядке:

Алгоритм кодирования

Все биты из текста берутся один за одним в порядке от старшего к младшему и подмешиваются к цвету в координате (X, Y, Канал) в порядке указанном в ключе.

Подмешивание осуществляется по следующему алгоритму (оба способа дают один и тот же результат):

Способ первый:

  • Заменяем у цвета канала младший бит на бит из текста.
    Например: цвет канала 152, а значение бита 1. В побитовой форме 152 это 1001 1000 в итоге получаем 1001 1001 (в десятичном виде: 153).
  • Получившееся значение сохраняем обратно в картинку.

Способ второй:

  • Для выбранного цвета канала берём ближайшее меньшее чётное.
    Например: цвет канала исходного изображения 131, значит, берём 130. Если 170, так и оставляем.
  • Прибавляем к получившемуся числу значение бита из текста.
  • Результат сложение сохраняется обратно в картинку.

Информация о побитовых операторах

  1. Урок №45. Побитовые операторы
  2. Урок №46. Битовые флаги и битовые маски