0

私は現在、ステガノグラフィ プロジェクトを行っています (自分用)。私はすでに少しのコードを作成しましたが、それについて考えた後、私が望むことを行うためのより良い方法があることがわかりました.

また、動的メモリ割り当てとバイナリ ファイル I/O を使用するのはこれが初めてです。

BMP 画像内のテキスト ファイルを非表示にするコードは次のとおりです。コードへのリンク

また、このコードでメッセージを格納するために LSB を使用しているのではなく、32 ビット/ピクセル (bbp) のイメージを想定して、アルファ バイトを置き換えていることに注意してください。イメージに 1、4、8、16、24 bpp がある場合、これがあまり柔軟ではないもう 1 つの理由です。たとえば、24 bbp の場合、アルファ チャネルは 1 バイトではなく 6 ビットになります。

私の質問は、構造体を使用して BMP 全体をメモリに読み込む最良の方法は何ですか?

これは私がそれを見る方法です:

  • BITMAPFILEHEADER の読み取り
  • BITMAPINFOHEADER の読み取り
  • ColorTable を読み取る (存在する場合)
  • PixelArray の読み取り

私は 2 つのヘッダーを読み取る方法を知っていますが、ColorTable は私を混乱させます。ColorTable のサイズがわかりません。または、画像に 1 つあるかどうかもわかりません。

また、PixelArray の後に、Wikipedia には ICC カラー プロファイルが存在する可能性があると書かれています。BMP ファイル形式へのリンク (ウィキペディア)

もう 1 つのことは、PixelArray の開始位置を知るためにヘッダー情報を知る必要があるため、上記のように複数の読み取りを行う必要があるということですよね?

まとめての質問で申し訳ありませんが、どうしたらいいのか、今のところ本当にわかりません。

4

1 に答える 1

3

カラー テーブルのサイズは によって決まりbV5ClrUsedます。

の場合にのみ、ICC カラー プロファイルがファイルに存在しますbV5CSType == PROFILE_EMBEDDED

ここのドキュメントは、そのすべての情報を提供します。

次に、24 ビットカラーとは、赤 8 個、緑 8 個、青 8 個、アルファ 0 個を意味します。アルファチャンネルを使用するには、それを 32 ビット RGBA に変換する必要があります。

最後に、アルファ チャネルは画像の表示に影響を与えるため、ステガノグラフィーに自由に使用することはできません。すべてのチャネルの最下位ビットを使用する方が実際には優れています (すべてのピクセルからではない可能性があります)。

于 2011-03-26T17:49:47.093 に答える