簡単な画像操作を行うために、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 倍に変化します。ただし、下の画像からわかるように、最終的な効果は同じです。
私のソース画像は次のとおりです。
出力画像 (下部の灰色の帯に注意してください):
何が起きてる?クリーンな変換を取得するにはどうすればよいですか?