Вы секретный агент, пытающийся общаться со своим отечеством. Конечно, информация должна быть скрыта, чтобы никто не пропустил ваше сообщение. Что будет лучше, чем кошка? Каждый любит смешные фотографии кошек [править] , так что они не будут подозревать , секретная информация скрывается там!
Вдохновленный алгоритмом игры, которую использует Монако для сохранения информации об уровнях общих уровней, ваша задача - написать программу, которая закодировала бы информацию в наименее значимый бит цветов изображения.
Формат кодирования:
- Первые 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));
}
code-golf
image-processing
steganography
TimWolla
источник
источник
Ответы:
Perl & ImageMagick (Linux),
198190Редактировать: По стечению обстоятельств, ранее я тестировал на компьютере с установленной версией ImageMagick версии 8 (глубина 8 бит). «Стандартная» версия Q16 требует явного указания
-depth 8
в командной строке. В Linuxidentify
результат также требует удаления новой строки. Оба фактора приводят к увеличению размера кода, поэтому я публикую в качестве ответа версию для Linux (возможно, и для Mac), с внесенными исправлениями, а также с удалением некоторых вещей, предназначенных только для Windows (преобразование cr-lf, двоичный файл против текстового и т. Д.). Портативная (чуть длиннее) версия выложена ближе к концу.С переводами строки для удобства чтения:
Бег:
Он читает из STDIN, имя файла изображения в первой строке, затем следует «секретное» сообщение, оканчивающееся на
ctrl-D
. Имя выходного файла оригинальное с.png
добавлением - не очень приятно, это сделано только для краткости.Вот изображение с некоторой очень секретной информацией, скрытой внутри:
И с некоторыми комментариями:
Далее - портативная версия, работает как в Windows (используется
ctrl-Z
для завершения ввода), так и в Linux, количество байт составляет 244.источник
Mathematica,
255234206 байтовЯ видел так многоА потом мои амбиции поиграть в гольф еще сильнее одолели меня ...255
s во время тестирования этого, я безумно рад размеру кода. :)Технически это функция, а не «программа», но, опять же, это в значительной степени то, как вы пишете «программы» в Mathematica, если эта концепция там даже действительна. Назови это как
Он вернет фактическое выражение изображения (потому что это наиболее естественный способ вернуть изображение в Mathematica), поэтому, если вам нужен файл, вам нужно его экспортировать:
Вот обязательный пример:
Я хотел бы показать вам декодированное сообщение здесь, но оно не подходит ... так что запустите его через декодер OP. ;)
Кстати, я мог бы заставить его работать с секретами UTF-8 всего за 7 байт (сменить
ToCharacterCode@#
на#~ToCharacterCode~"utf8"
).Ungolfed код:
источник
PHP, 530 байт
Беги как
php 25443.php -i<input image> -o<output image> -t<file to hide>
.А вот пример изображения.
Код Ungolfed скрыт в образце. Протестировано с декодером ОП. Извините за не смешную кошачью картинку.
источник
0xff
до255
.<?function
.