4

Bitmap クラスを使用して JPEG 画像を保存しようとしています。指定した品質レベルに関係なく、シャープなエッジが常にぼやけていることに気付きました。1 つまたは複数のチャネルのサブサンプリングが原因であることがわかりました。画像を保存するときにサブサンプリングを無効にするにはどうすればよいですか?

私は現在このコードを使用しています:

EncoderParameters parameters = new EncoderParameters(1);
parameters.Param[0] = new EncoderParameter(Encoder.Quality, 85L);

ImageCodecInfo codec = GetEncoderInfo("image/jpeg");
image.Save(path, codec, parameters);

ノート

JPEG が非可逆であることは知っていますが、それはここでは問題ではありません。ImageMagick を使用してデフォルトのオプションで画像を保存すると、同様の結果が得られます。しかし、1:1:1 のサブサンプリングを指定すると、ぼやけがなくなります。

より良い圧縮が必要なため、PNG は使用したくありません。画像を BMP として保存し、手動で JPEG に変換すると、ぼやけることなく優れた結果が得られます。したがって、形式はここでは問題になりません。

4

3 に答える 3

4

JPEG は非可逆圧縮を使用する画像形式です。どのような品質設定を選択しても、画像が劣化します。

これには、.PNG などのより適切な形式を使用してみてください。.PNG ファイルは可逆圧縮アルゴリズムを使用するため、表示されているアーティファクトは得られません。


問題 (編集内容を読んだ後) は、GDI+ がデフォルトのエンコーダーで JPG ファイルに 4:1:1 サブサンプリングを使用していることが原因である可能性があります。

別のエンコーダーをインストールできると思います(これを行う方法がわかりません)。それ以外の場合は、MagickNet などを使用して JPG ファイルの保存を処理することをお勧めします。(これは ImageMagick の .net ラッパーです。いくつかあります。)


編集 2:これをさらに調べた後、 Encoder Luminance TableChrominance Tableを微調整することで、これに何らかの影響を与えることができるようです。

于 2009-04-13T22:28:26.247 に答える
2

私はこれを2日間行う方法を模索してきましたが、M$がGDI+にそのような単純な機能を含んでいなかったのではないかと思いました。別の方法として、libjpegの周りに小さなラッパー関数を記述して、独自のBitmap->Jpegコンプレッサーを実装しました。重要なステップは、次のようにサブサンプリングをオフにすることです。

struct jpeg_compress_struct cinfo;
...
jpeg_set_defaults(&cinfo);
cinfo.comp_info[0].h_samp_factor = 1;
cinfo.comp_info[0].v_samp_factor = 1;
cinfo.comp_info[1].h_samp_factor = 1;
cinfo.comp_info[1].v_samp_factor = 1;
cinfo.comp_info[2].h_samp_factor = 1;

しかし、これは私にとって別の問題を引き起こしました:libjpegはexifタグの書き込みをサポートしていません。これも必要です。もちろん、GDI +はjpgを再エンコードせずにタグを追加することはありません。これは、目的を完全に無効にします。libexifを調べましたが、VisualStudioでコンパイルできませんでした。誰かがGDI+でサブサンプリングを無効にする方法を見つけたとしても、それについて聞いてみたいです...

于 2009-07-12T18:12:56.510 に答える
0

Graphics オブジェクトの SmoothingMode プロパティを変更しましたか? 私の実験では、SmoothingMode 値をデフォルト以外に指定すると、鋭いエッジがぼやけることがわかりました。試してみて、それが役立つかどうかを確認してください。

于 2009-06-16T18:21:41.313 に答える