Você é um agente secreto tentando se comunicar com sua pátria. É claro que a informação precisa estar oculta para que ninguém escute a sua mensagem. O que seria mais adequado do que um gato? Todo mundo adora fotos engraçadas de gatos [carece de fontes?] , Para que eles não vão suspeitar informações esconderijo secreto lá!
Inspirado no algoritmo que o jogo Monaco usa para salvar as informações de níveis compartilhados , é sua tarefa escrever um programa que codifique as informações nas partes menos significativas das cores de uma imagem.
Formato de codificação:
- Os primeiros 24 bits determinam o comprimento da cadeia de bytes codificada restante em bits
- A imagem é lida da esquerda para a direita e de cima para baixo, obviamente começando no pixel superior esquerdo
- Os canais são lidos de vermelho para verde e azul
- O bit menos significativo de cada canal é lido
- Os bits são salvos na ordem Big Endian
Regras:
- Seu programa usa uma única sequência de bytes para ser codificada e um nome de arquivo de imagem único para a imagem base
- A imagem resultante deve ser exibida como um arquivo PNG de cor verdadeira
- Você pode usar E / S da forma que desejar (ARGV, STDIN, STDOUT, gravação / leitura de um arquivo), desde que indique como usar seu programa
- Você deve escolher uma imagem aleatória de um gato engraçado e codificar seu programa para mostrar que seu programa funciona
- Você pode presumir que você recebeu apenas uma entrada válida, se a quantidade de bits não for suficiente, a imagem não estiver no formato de cores verdadeiras, a imagem não existir ou problemas semelhantes, você pode fazer o que deseja
- Você pode assumir que a imagem fornecida não contém nenhum canal alfa
- O comprimento é contado em bytes UTF-8 sem BOM
Você pode usar esse script PHP para testar sua solução, fornecer o nome do arquivo PNG como o primeiro argumento da linha de comando:
<?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));
}