Vous êtes un agent secret essayant de communiquer avec votre patrie. Bien sûr, les informations doivent être cachées afin que personne ne laisse tomber votre message. Quoi de mieux qu'un chat? Tout le monde aime les images drôles de chats [citation nécessaire] , donc ils ne soupçonneront pas que des informations secrètes s'y cachent!
Inspiré par l'algorithme que le jeu Monaco utilise pour enregistrer les informations de niveau des niveaux partagés, il vous incombe d'écrire un programme qui a codé les informations dans le bit le moins significatif des couleurs d'une image.
Format d'encodage:
- Les 24 premiers bits déterminent la longueur de la chaîne d'octets codée restante en bits
- L'image est lue de gauche à droite et de haut en bas, commençant évidemment dans le pixel supérieur gauche
- Les canaux sont lus du rouge au vert au bleu
- Le bit le moins significatif de chaque canal est lu
- Les bits sont enregistrés dans l'ordre Big Endian
Règles:
- Votre programme prend une seule chaîne d'octets à encoder et un seul nom de fichier d'image pour l'image de base
- L'image résultante doit être sortie en tant que fichier PNG de couleur vraie
- Vous pouvez utiliser les E / S sous la forme que vous souhaitez (ARGV, STDIN, STDOUT, écriture / lecture à partir d'un fichier), tant que vous indiquez comment utiliser votre programme
- Vous devez choisir une image aléatoire d'un chat drôle et y coder votre programme pour montrer que votre programme fonctionne
- Vous pouvez supposer que vous ne disposez que d'une entrée valide, si la quantité de bits n'est pas suffisante, l'image n'est pas au format couleur véritable, l'image n'existe pas ou des problèmes similaires, vous pouvez faire ce que vous voulez
- Vous pouvez supposer que l'image fournie ne contient aucun canal alpha
- La longueur est comptée en octets UTF-8 sans BOM
Vous pouvez utiliser ce script PHP pour tester votre solution, fournir le nom du fichier PNG comme premier argument de ligne de commande:
<?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));
}