您是试图与祖国沟通的秘密特工。当然,信息需要隐藏,因此没人会掉落您的信息。有什么比猫更合适的呢?每个人都喜欢猫的有趣图片[需要引用],因此他们不会怀疑其中隐藏着秘密信息!
受到摩纳哥用来保存共享关卡的关卡信息的算法的启发,编写一个程序将信息编码为图像颜色的最低有效位是您的任务。
编码格式:
- 前24位确定剩余编码字节串的长度(以位为单位)
- 从左到右和从上到下读取图像,显然从左上像素开始
- 从红色到绿色到蓝色读取通道
- 读取每个通道的最低有效位
- 位按大端顺序保存
规则:
- 您的程序需要对单个字节字符串进行编码,并对基本映像使用单个映像文件名
- 生成的图像必须作为真彩色PNG文件输出
- 您可以使用任意形式的I / O(ARGV,STDIN,STDOUT,从文件写入/读取),只要您声明如何使用程序即可
- 您必须随机选择一个有趣的猫咪图片并将其编码到其中,以表明您的程序可以正常工作
- 您可以假设只提供了有效的输入,如果位数不足,图像不是真彩色格式,图像不存在或类似的问题,您可以做自己想做的事情
- 您可以假定所提供的图像不包含任何Alpha通道
- 长度以不带BOM的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));
}