Вы секретный агент, пытающийся общаться со своим отечеством. Конечно, информация должна быть скрыта, чтобы никто не пропустил ваше сообщение. Что будет лучше, чем кошка? Каждый любит смешные фотографии кошек [править] , так что они не будут подозревать , секретная информация скрывается там!
Вдохновленный алгоритмом игры, которую использует Монако для сохранения информации об уровнях общих уровней, ваша задача - написать программу, которая закодировала бы информацию в наименее значимый бит цветов изображения.
Формат кодирования:
- Первые 24 бита определяют длину оставшейся кодированной строки байтов в битах
- Изображение читается слева направо и сверху вниз, очевидно, начиная с верхнего левого пикселя.
- Каналы читаются с красного на зеленый и синий
- Читается младший значащий бит из каждого канала
- Биты сохраняются в порядке Big Endian
Правила:
- Ваша программа принимает одну строку байтов для кодирования и одно имя файла изображения для базового изображения
- Полученное изображение должно быть в формате PNG.
- Вы можете использовать ввод / вывод в любой удобной для вас форме (ARGV, STDIN, STDOUT, запись / чтение из файла), если вы указываете, как использовать вашу программу
- Вы должны выбрать случайное изображение забавного кота и закодировать в нем свою программу, чтобы показать, что ваша программа работает
- Вы можете предположить, что вам предоставлен только верный ввод, если количество битов недостаточно, изображение не в формате истинного цвета, изображение не существует или аналогичные проблемы, вы можете делать то, что вы хотите
- Вы можете предположить, что предоставленное изображение не содержит альфа-канала
- Длина считается в байтах UTF-8 без спецификации
Вы можете использовать этот PHP-скрипт для тестирования вашего решения, указав имя PNG-файла в качестве первого аргумента командной строки:
<?php
if ($argc === 1) die('Provide the filename of the PNG to read from');
$imageSize = @getimagesize($argv[1]);
if ($imageSize === false) die('Not a PNG file');
list($width, $height) = $imageSize;
$image = imagecreatefrompng($argv[1]);
$read = 0;
$bits = '';
for ($y = 0; $y < $height; $y++) {
for ($x = 0; $x < $width; $x++) {
$colorAt = imagecolorat($image, $x, $y);
$red = ($colorAt >> 16) & 0xFF;
$green = ($colorAt >> 8) & 0xFF;
$blue = ($colorAt >> 0) & 0xFF;
$bits .= ($red & 1).($green & 1).($blue & 1);
$read += 3;
if ($read == 24) {
$length = (int) bindec($bits);
$bits = '';
}
else if ($read > 24 && ($read - 24) > $length) {
$bits = substr($bits, 0, $length);
break 2;
}
}
}
if (strlen($bits) !== $length) die('Not enough bits read to fulfill the length');
$parts = str_split($bits, 8);
foreach ($parts as $part) {
echo chr(bindec($part));
}