0

簡単な画像操作を行うために、WPF 画像処理コンポーネントを使用しています。私は大まかにHow to Encode & Decode a JPEG Imageに関する MS の記事に従っています。

私のコードは簡単です:

BitmapImage bi = new BitmapImage();

bi.BeginInit();
bi.UriSource = new Uri("D:\\Temp\\StackOverflowCapture.png");
//bi.DecodePixelWidth = 1024;
//bi.DecodePixelHeight = 768;
bi.EndInit();

var jpg                  = new JpegBitmapEncoder();
    jpg.QualityLevel     = 90;
    //jpg.FlipHorizontal = false;
    //jpg.FlipVertical   = false;
    jpg.Frames.Add(BitmapFrame.Create(bi));

var fs = new FileStream("D:\\Temp\\StackOverflow_Result.jpg", FileMode.Create);

jpg.Save( fs );
jpg = null;

コード スニペットは奇妙なアーティファクトを作成します。最後の数行がグレー一色のブロックです。まるでエンコーダーが書き込むピクセルを使い果たしたかのようです。グレーの量は、入力として使用する画像 (さまざまな解像度、jpeg、png) または有効にするオプション (デコード時に解像度を強制する) に応じて、2 倍または 3 倍に変化します。ただし、下の画像からわかるように、最終的な効果は同じです。

私のソース画像は次のとおりです。

ここに画像の説明を入力

出力画像 (下部の灰色の帯に注意してください):

ここに画像の説明を入力

何が起きてる?クリーンな変換を取得するにはどうすればよいですか?

4

1 に答える 1

2

これは間違いなく耳の間の短絡でした。ただし、同様の弱点を持つ他の人のために、私は自分の質問に答えています。

ストリームを閉じる/フラッシュする必要があります。または、ブロックで 作成することをお勧めしますfsusing

したがって、変更されたコードは次のとおりです。

BitmapImage bi = new BitmapImage();

bi.BeginInit();
bi.UriSource = new Uri("D:\\Temp\\StackOverflow_Source.png");
bi.EndInit();

var jpg                  = new JpegBitmapEncoder();
    jpg.QualityLevel     = 90;
    jpg.Frames.Add(BitmapFrame.Create(bi));

var fs = new FileStream("D:\\Temp\\StackOverflow_Result.jpg", FileMode.Create);

jpg.Save( fs );
fs.close();       <--- duh, flush the stream to disk
jpg = null;
于 2012-12-14T15:55:36.800 に答える