ビットマップでテキストを非表示

こんにちは、habrachelovek様。 ビットマップ画像のテキストを非表示にする方法についての考えは、すでに大騒ぎでスキップされました。 残念ながら、私はこのトピックに関するトピックを見つけられず、このギャップを埋めることにしました。 カットの下には、ビットマップ内のテキストを非表示にする方法と、C#での実装があります。



問題の声明

任意のwindows-1251エンコードされたテキストを24ビットのビットマップ図面で非表示にし、歪みなく吐き出します。



Bmpファイル構造

まず、ビットマップファイルとは何かを思い出させてください。 皆さんはこれを非常によく知っていると確信しています。提示された資料に基づいてテキストを隠すためのアルゴリズムを説明する方が、より視覚的になります。 など。 bmpファイルは4つの部分で構成されます。
  1. ファイルヘッダー
  2. 画像タイトル(欠落している可能性があります)
  3. パレット(不在の場合もあります)
  4. 画像自体
ファイルヘッダーには、画像のビット深度などのサービス情報が含まれています。 ところで、パレットは24ビットの描画には使用されません。 割り当てでは、24ビット画像のみで作業することを明確に示しているため、理想的には、入力画像が要件を満たしているかどうかを確認できます。

次に、画像自体に直接移動しましょう。 ご存知のように、bmp形式はデフォルトでは圧縮を提供しません(ただし、 RLEアルゴリズムによる圧縮はサポートされています)。 したがって、この場合の各ピクセルは24ビット、各色成分の1バイトでエンコードされます。 したがって、多かれ少なかれではなく、正確に16777216色をエンコードできます。 わかりやすくするために、図を示します。







テキスト非表示アルゴリズムのアイデア

おそらく、あなたはすでにアイデアが何であるかを推測しています。 問題は、一般の人(プロのアーティストや写真家ではない)の目が上記の色よりもはるかに少ない色を識別することです。 どの本も目が何色を区別できるかという質問に対する明確な答えはありませんが、私が出会った最大の数字は1000万です。目標。

いくつかの数字:たとえば、RGBコンポーネントから2つの下位ビットを取得し、素晴らしく減算します。 つまり、24ビットのうち18個が残っており、正確に262144色をエンコードできます。 次に、各文字が8ビットで表されるwindows-1251でエンコードされたテキストを見てみましょう。 簡単な数学的計算を使用して、3文字を4ピクセルで保存できることがわかります。 したがって、画像1024x768では、786432ピクセルを589824文字保存できます。 悪くないでしょ? わかりやすくするために、2つの写真を示します。 最初の画像には元の画像があり、2番目の画像には各色成分の下位2ビットがテキストで埋められています。 トラフィックを後悔するために、画像がpngに変換されるようにすぐに予約してください。



元の画像:






テキストを含む画像






よく見ると、2番目の画像の色は暗く見えます。 はい、そうです。 しかし、あなたと私は、提示された画像に何か問題があることを知っています。もしあなたが知らなければ、テキストがそこに隠されているとは思いませんでした。 ちなみに、「Hello World !!! =)” 100回伝播。

以上です。 ご覧のとおり、アイデアは非常にシンプルです。 ちなみに、提示されたメソッドはLSBと呼ばれます( frolに感謝します)。 最後に、C#で実装を確認できます。



C#実装

提示された実装は、「完全なコード」スタイルで授与されることを主張せず、実際に説明されたアルゴリズムを示すだけです。 この場合、コードの美しさではなく、可視性を追求しました。 ここで 、アーカイブと子孫をダウンロードできます(〜20 kb)



作業例

元の画像:






テキストに2ビットの色成分が割り当てられた画像






テキストに4ビットの色成分が割り当てられた画像






テキストに6ビットの色成分が割り当てられた画像






ご清聴ありがとうございました!



All Articles