2016-05-18 5 views
0

複数のファイルタイプをサポートするステガノグラフィプログラムを作成しています。 WAVファイルと、現在動作していないイメージファイルの実装があります。画像の保存と読み込み後にLockBits/UnlockBitsを使用するとデータが破損する

イメージキャリアは基本的に、.NETクラスのビットマップとイメージのラッパーです。 LockBits/UnlockBitsを使用して、イメージに含まれるバイト配列にアクセスします。バイト配列の変更が終了すると、プログラムはそれをビットマップにコピーし直します。

データがコピーされていると、ビットマップのロックが解除されたとき、私は使用してそれを保存します。

image.Save(destination, ImageFormat.Png); 

私はイメージをロードする次の時間を、私は以前に保存されたバイト配列が同じであることを期待します保存されたImageから抽出するものです(PNGはロスレスです)。ただし、必ずしもそうではありません。

バイト配列は同じですが、値が1のバイトのうちのいくつかは0に変更されています。これ以外のパターンは実際にはありません。

私が見逃したImage.SaveやPNG形式についてはありますか?

編集:正確に同じデータを埋め込むと、同じ属性(24 bppとPNGの両方)を共有していても、一部の画像では機能しますが、すべてでは機能しません。

+0

私はそれが直観に反していると知っていますが、画像がまだ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

+0

イメージはPNG形式で保存されているように見えますが、ヘッダーに示されています。 – user1245704

+0

LockBits操作から得られた配列は圧縮されていません。アライメントのストライドを持つ生のピクセルです。ラッパーがこれを考慮に入れていることを確認してください https://msdn.microsoft.com/en-us/library/system.drawing.imaging.bitmapdata.stride%28v=vs.110%29.aspx – kagelos

答えて

0

イメージを保存するときに、さまざまな圧縮アルゴリズムを指定できます。デフォルトのものでは、このような望ましくない効果が生じる可能性があります。もう一度試してみてください。

参照:
- System.Drawing.Imaging.Encoder Compression
- System.Drawing.Imaging.EncoderValue Enumeration
- Image.Save Method (String, ImageCodecInfo, EncoderParameters)

画質でこれらの圧縮アルゴリズムを混同しないでください。画像の品質は、可逆圧縮を使用するため、PNGには影響しません。

+0

私が知る限り、これをPNG形式で保存するときは指定できません。 – user1245704

+0

これはいつでも指定できます。質問は、PNGコーデックがそれを考慮するかどうかです。圧縮アルゴリズムが異なると、ファイルサイズが異なります。だから、それが動作するかどうかを見るのは簡単でしょう。 (** NOTE **: 'Save'メソッドには2つのオーバーロードがあります)。 –

+1

それは本当ですが、それは動作しませんでした。これらの圧縮オプションはTIFFでしか動作しないようです。 – user1245704

関連する問題