Приветствую тебя, мой читатель. Я хотел бы поведать тебе одну историю о том, как я успешно (а может быть неуспешно, судить тебе) добавлял яркости и света в безрадостный облик будничной переписки.
Сидя однажды глубоким вечером, даже лучше сказать ночью за компьютером, я придумывал сюжет программы. Не так уж прямо сказать и скоро, но появилась одна довольно интересная идея: а почему бы не попробовать засунуть чёрно-белый текст в какое-нибудь яркое до жизнерадостности изображение. Мало, я думаю, осталось людей, не знающих QR-кодов, а уж на хабре и подавно, так что моя идея была далеко не нова. Единственное, что могло дать моей идее право на жизнь, так это то, что «жизнерадостность» в QR-коды довольно сложно упаковывается. На этом недостатке QR-кодов я и решил ваять свой «велосипед».
Для начала необходимо было разобраться с цветами, удобнее всего было бы использовать все имеющиеся в TrueColor цветах, то есть 256*256*256=16777216. Это позволяло бы в одном пикселе изображения хранить аж целых 3 байта, что было бы очень приятно, однако неожиданно всплыло одно «но»: а что, если изображение кто-нибудь перекодирует, да ещё с потерей качества? Это приведёт к потере данных, что не есть хорошо. А посему я решил, что мне вполне хватит 16-ти цветов, что даёт возможность хранить один байт в двух пикселях изображения, что, впрочем, тоже приемлемо. Кстати о пикселях, использование одного пикселя в качестве информационного поля, по моему мнению, является неудобным: во-первых при перекодировке изображения из-за этого, опять-таки, может произойти потеря данных, а во-вторых это не очень красиво будет смотреться, поэтому я решил использовать в качестве информационного поля квадрат со стороной 8 пикселей.
Итак, приступим к принципу работы программы, он чрезвычайно прост. Начнём с кодирования текста в изображение. Вначале добавляем к исходной строке нулевой символ, что бы при раскодировании знать, где заканчивается строка. Далее вычисляем размеры изображения, для этого округляем до большего квадратный корень из длины строки умноженной на два. Двойка получается из того соображения, что в одном информационном поле может храниться 4 бита, т.к. цветов 16, а log(16, 2) = 4. Полученное число будет шириной, а по совместительству и высотой (потому как изображение квадратное) изображения, измеряемого покамест в информационных полях. Теперь добавляем к строке столько случайных символов, что бы её длина была равна квадрату ширины (высоты) изображения. Далее всё очень просто: последовательно (слева направо и сверху вниз) записываем младшие и старшие части байтов строки в массив, который после отрисовываем на изображении. Думаю рассказывать, о раскодировании смысла нет, так как оно выполняется точно так же как и кодирование, только наоборот. Замечу только, что для выяснения цвета информационного поля, находится среднее арифметическое по цветам всех его пикселей, вернее по каждой составляющей цвета, и сравнивается с базовыми цветами, записанными в константе.
После проверки работы программы я увидел, что некоторые цвета появляются в изображении чаще других, я понял, что это были поля, в которых были записаны старшие части байтов, которые не очень разнообразны в символах русского алфавита. Что бы решить эту проблему, а заодно и добавить серьёзности программе, я добавил в программу шифрование, что привело к нужным результатам.
Приведу несколько примеров работы программы:
Кстати, писал я эту программу на Delphi (хотя надо наверное было сказать об этом раньше, ну да ладно). Вот ссылка на неё: Картиночки.exe
В программе этой есть два довольно серьёзных минуса: Невозможность раскодировки после изменения размера изображения и отсутствие корректирующих кодов. А впрочем, я думаю, и кроме этих косяков можно найти кучу.
А вообще, по моему мнению, программа оправдала возложенные на неё надежды: стена в небезызвестной социальной сети [В]контакте выглядит сочно и радостно.
Хм… Сказать мне особо больше нечего, так что на этой светлой ноте я прощаюсь с тобой, терпеливый мой читатель
Сидя однажды глубоким вечером, даже лучше сказать ночью за компьютером, я придумывал сюжет программы. Не так уж прямо сказать и скоро, но появилась одна довольно интересная идея: а почему бы не попробовать засунуть чёрно-белый текст в какое-нибудь яркое до жизнерадостности изображение. Мало, я думаю, осталось людей, не знающих QR-кодов, а уж на хабре и подавно, так что моя идея была далеко не нова. Единственное, что могло дать моей идее право на жизнь, так это то, что «жизнерадостность» в QR-коды довольно сложно упаковывается. На этом недостатке QR-кодов я и решил ваять свой «велосипед».
Для начала необходимо было разобраться с цветами, удобнее всего было бы использовать все имеющиеся в TrueColor цветах, то есть 256*256*256=16777216. Это позволяло бы в одном пикселе изображения хранить аж целых 3 байта, что было бы очень приятно, однако неожиданно всплыло одно «но»: а что, если изображение кто-нибудь перекодирует, да ещё с потерей качества? Это приведёт к потере данных, что не есть хорошо. А посему я решил, что мне вполне хватит 16-ти цветов, что даёт возможность хранить один байт в двух пикселях изображения, что, впрочем, тоже приемлемо. Кстати о пикселях, использование одного пикселя в качестве информационного поля, по моему мнению, является неудобным: во-первых при перекодировке изображения из-за этого, опять-таки, может произойти потеря данных, а во-вторых это не очень красиво будет смотреться, поэтому я решил использовать в качестве информационного поля квадрат со стороной 8 пикселей.
Итак, приступим к принципу работы программы, он чрезвычайно прост. Начнём с кодирования текста в изображение. Вначале добавляем к исходной строке нулевой символ, что бы при раскодировании знать, где заканчивается строка. Далее вычисляем размеры изображения, для этого округляем до большего квадратный корень из длины строки умноженной на два. Двойка получается из того соображения, что в одном информационном поле может храниться 4 бита, т.к. цветов 16, а log(16, 2) = 4. Полученное число будет шириной, а по совместительству и высотой (потому как изображение квадратное) изображения, измеряемого покамест в информационных полях. Теперь добавляем к строке столько случайных символов, что бы её длина была равна квадрату ширины (высоты) изображения. Далее всё очень просто: последовательно (слева направо и сверху вниз) записываем младшие и старшие части байтов строки в массив, который после отрисовываем на изображении. Думаю рассказывать, о раскодировании смысла нет, так как оно выполняется точно так же как и кодирование, только наоборот. Замечу только, что для выяснения цвета информационного поля, находится среднее арифметическое по цветам всех его пикселей, вернее по каждой составляющей цвета, и сравнивается с базовыми цветами, записанными в константе.
После проверки работы программы я увидел, что некоторые цвета появляются в изображении чаще других, я понял, что это были поля, в которых были записаны старшие части байтов, которые не очень разнообразны в символах русского алфавита. Что бы решить эту проблему, а заодно и добавить серьёзности программе, я добавил в программу шифрование, что привело к нужным результатам.
Приведу несколько примеров работы программы:
Хабрахабр |
![]() (Ключ: «Хабрахабр») |
Я вас любил: любовь ещё, быть может, В душе моей угасла не совсем; Но пусть она вас больше не тревожит; Я не хочу печалить вас ничем. Я вас любил безмолвно, безнадежно, То робостью, то ревностью томим; Я вас любил так искренно, так нежно, Как дай вам Бог любимой быть другим. |
![]() (Ключ: «Пушкин») |
Я вас любил: любовь ещё, быть может, В душе моей угасла не совсем; Но пусть она вас больше не тревожит; Я не хочу печалить вас ничем. Я вас любил безмолвно, безнадежно, То робостью, то ревностью томим; Я вас любил так искренно, так нежно, Как дай вам Бог любимой быть другим. |
![]() (На этот раз без ключа, и сразу заметен описанный выше косяк) |
Кстати, писал я эту программу на Delphi (хотя надо наверное было сказать об этом раньше, ну да ладно). Вот ссылка на неё: Картиночки.exe
В программе этой есть два довольно серьёзных минуса: Невозможность раскодировки после изменения размера изображения и отсутствие корректирующих кодов. А впрочем, я думаю, и кроме этих косяков можно найти кучу.
А вообще, по моему мнению, программа оправдала возложенные на неё надежды: стена в небезызвестной социальной сети [В]контакте выглядит сочно и радостно.
Хм… Сказать мне особо больше нечего, так что на этой светлой ноте я прощаюсь с тобой, терпеливый мой читатель