あなたはあなたの祖国と通信しようとしている秘密のエージェントです。もちろん、情報を隠して、だれもメッセージを落とさないようにする必要があります。猫よりも適しているものは何ですか?誰もが猫の面白い写真を愛している[要出典]ので、彼らはそこに隠れている秘密の情報を疑うことはありません!
ゲームのモナコが共有レベルのレベル情報を保存するために使用するアルゴリズムに触発され、画像の色の最下位ビットに情報をエンコードするプログラムを作成するのはあなたのタスクです。
エンコード形式:
- 最初の24ビットは、残りのエンコードされたバイト文字列の長さをビット単位で決定します
- 画像は左から右、上から下に読み取られ、明らかに左上のピクセルから始まります。
- チャンネルは赤から緑、青に読み取られます
- 各チャネルの最下位ビットが読み取られます
- ビットはビッグエンディアン順に保存されます
ルール:
- プログラムは、エンコードされる単一のバイト文字列と、ベースイメージの単一のイメージファイル名を受け取ります
- 結果の画像はトゥルーカラーPNGファイルとして出力される必要があります
- プログラムの使用方法を述べる限り、好きな形式(ARGV、STDIN、STDOUT、ファイルの書き込み/読み取り)でI / Oを使用できます。
- 面白い猫のランダムな画像を選択し、プログラムをエンコードして、プログラムが機能することを示す必要があります
- 有効な入力のみが提供され、ビットの量が十分でない場合、画像がトゥルーカラー形式ではない場合、画像が存在しない場合、または同様の問題が発生する場合があります
- 提供された画像にはアルファチャンネルが含まれていないと想定できます
- 長さは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));
}