複数のファイルタイプをサポートするステガノグラフィプログラムを作成しています。 WAVファイルと、現在動作していないイメージファイルの実装があります。画像の保存と読み込み後にLockBits/UnlockBitsを使用するとデータが破損する
イメージキャリアは基本的に、.NETクラスのビットマップとイメージのラッパーです。 LockBits/UnlockBitsを使用して、イメージに含まれるバイト配列にアクセスします。バイト配列の変更が終了すると、プログラムはそれをビットマップにコピーし直します。
データがコピーされていると、ビットマップのロックが解除されたとき、私は使用してそれを保存します。
image.Save(destination, ImageFormat.Png);
私はイメージをロードする次の時間を、私は以前に保存されたバイト配列が同じであることを期待します保存されたImageから抽出するものです(PNGはロスレスです)。ただし、必ずしもそうではありません。
バイト配列は同じですが、値が1のバイトのうちのいくつかは0に変更されています。これ以外のパターンは実際にはありません。
私が見逃したImage.SaveやPNG形式についてはありますか?
編集:正確に同じデータを埋め込むと、同じ属性(24 bppとPNGの両方)を共有していても、一部の画像では機能しますが、すべてでは機能しません。
私はそれが直観に反していると知っていますが、画像がまだjpegとして保存されているかどうかは疑問です。ファイルを未加工のバイトストリームとして開いて、ヘッダーの最初の数バイトを見ると、何が得られますか? [JPEG](https://en.wikipedia.org/wiki/JPEG_File_Interchange_Format#File_format_structure)または[PNG](http://www.libpng.org/pub/png/spec/1.2/PNG-Structure.html)? – Reti43
イメージはPNG形式で保存されているように見えますが、ヘッダーに示されています。 – user1245704
LockBits操作から得られた配列は圧縮されていません。アライメントのストライドを持つ生のピクセルです。ラッパーがこれを考慮に入れていることを確認してください https://msdn.microsoft.com/en-us/library/system.drawing.imaging.bitmapdata.stride%28v=vs.110%29.aspx – kagelos