Eres un agente secreto que intenta comunicarte con tu patria. Por supuesto, la información debe estar oculta para que nadie deje caer su mensaje. ¿Qué sería más adecuado que un gato? ¡A todos les encantan las fotos divertidas de gatos [cita requerida] , por lo que no sospecharán que se esconde información secreta allí!
Inspirado por el algoritmo que utiliza el juego Mónaco para guardar la información de nivel de los niveles compartidos , es su tarea escribir un programa que codifique la información en el bit menos significativo de los colores de una imagen.
Formato de codificación:
- Los primeros 24 bits determinan la longitud de la cadena de bytes codificada restante en bits
- La imagen se lee de izquierda a derecha y de arriba a abajo, obviamente comenzando en el píxel superior izquierdo
- Los canales se leen de rojo a verde a azul.
- Se lee el bit menos significativo de cada canal
- Los bits se guardan en orden Big Endian
Reglas:
- Su programa toma una sola cadena de bytes para codificar y un solo nombre de archivo de imagen para la imagen base
- La imagen resultante debe aparecer como un archivo PNG de color verdadero
- Puede usar E / S en cualquier forma que desee (ARGV, STDIN, STDOUT, escritura / lectura de un archivo), siempre que indique cómo usar su programa
- Debes elegir una imagen aleatoria de un gato divertido y codificar tu programa en ella para mostrar que funciona
- Puede suponer que solo se le proporciona una entrada válida, si la cantidad de bits no es suficiente, la imagen no está en formato de color verdadero, la imagen no existe o problemas similares, puede hacer lo que quiera
- Puede suponer que la imagen proporcionada no contiene ningún canal alfa
- La longitud se cuenta en UTF-8 bytes sin BOM
Puede usar este script PHP para probar su solución, proporcione el nombre del archivo PNG como primer argumento de línea 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));
}