コンピュータ上で扱われる画像は,一般に,色を値で表しています. 光の三原色といわれるように,多くの場合 3 つの色の組み合わせで色を表現します. そして,それぞれの原色のみを取り出したものをチャンネルということがあります. この問題では,一枚の画像を複数の側から,つまり複数のチャンネルから見ることが大切です.
しかし,画像を表示して見る限り画像にはおかしいところはないように思えます. RGB それぞれのチャンネルを取り出して見ても同様です. ここで,このファイルが PNG 形式であることに注目します. この形式は,一般の写真に用いられる JPEG 形式と違い,透過色を持つことができます. つまり,透明度を表す値が存在する可能性があるのです. これをアルファチャンネルと呼ぶことがあります.
アルファチャンネルに注目して画像を見てみましょう. �この画像は A=254 と A=255 (完全に不透明) の 2 種類のピクセルだけで構成されていることに気づきます. プログラム的に A=255 の��ピクセルのみに絞り込んでみましょう. 擬似コードで表すと以下のようになります:
var image = LoadImage("christmas.png");
var output = CreateImage(image.Width, image.Height);
for (int y = 0; y < image.Height; ++y)
{
for (int x = 0; x < image.Width; ++x)
{
output[y, x] = image[y, x].A == 255 ? Colors.Black : Colors.White;
}
}
output.Save("solved.png");
写真の隠された側を見つけることができました!