web-dev-qa-db-ja.com

C#による高品質JPEG圧縮

C#を使用していて、JPEG形式を使用して画像を保存したい。ただし、.NETは画像の品質を低下させ、十分ではない圧縮で保存します。

ファイルを元の品質とサイズで保存したい。次のコードを使用していますが、圧縮と品質は元のコードとは異なります。

Bitmap bm = (Bitmap)Image.FromFile(FilePath); 
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 
ImageCodecInfo ici = null; 

foreach (ImageCodecInfo codec in codecs)
{ 
    if (codec.MimeType == "image/jpeg") 
    ici = codec; 
} 

EncoderParameters ep = new EncoderParameters(); 
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100); 
bm.Save("C:\\quality" + x.ToString() + ".jpg", ici, ep);

私はスタジオの写真をアーカイブしています。品質と圧縮は非常に重要です。ありがとう。

35
Baran

品質を100%に設定しているようです。つまり、圧縮は行われません。

圧縮レベル(80、50など)を変更し、品質に満足できない場合は、別の画像ライブラリを試してください。 LEADTools には、優れた(非フリー)エンジンがあります。

更新:コメンターが述べたように、100%の品質は、JPEGを使用する場合でもロスレス圧縮を意味しません。画像を読み込んで何かをしてから、再度保存すると、最終的に画像が劣化します。データを失わずに画像を変更して保存する必要がある場合は、TIFF、PNG、BMPなどのロスレス形式を使用する必要があります。圧縮されたTIFF(圧縮されていてもロスレスであるため)またはPNGを使用します。

11
Michael Todd

ライブラリ(少なくともMicrosoftが提供するデフォルトのWindowsライブラリ)に組み込まれた.Netエンコーダーはかなり悪いです:

http://b9dev.blogspot.com/2013/06/nets-built-in-jpeg-encoder-convenient.html

部分更新

私は現在、 ここで概説されているアプローチ を使用しています。これは、サイズ変更にImageMagickを使用し、最終圧縮にjpegoptimを使用し、はるかに良い結果をもたらします。私はそれが部分的な答えであることを理解していますが、時間が許せばこれについて詳しく説明します。

古い回答

ImageMagickは、これまでに見つけた最良の選択です。比較的強固なjpeg圧縮を実行します。

http://magick.codeplex.com/

欠点がいくつかあります。

  1. 優れていますが、完璧ではありません。特に、そのクロマサブサンプリングは90%以上の高詳細度に設定され、それから詳細度の低いレベルにジャンプします-これは多くのアーティファクトをもたらす可能性があります。サブサンプリングを無視したい場合、これは実際には非常に便利です。しかし、たとえば50%の高詳細なサブサンプリングが必要な場合は、さらに大きな課題があります。また、PhotoshopまたはGoogle PageSpeedの品質/圧縮レベルにはまだそれほど影響しません。

  2. サーバーには特別な展開の負荷があり、見逃しがちです。 Visual Studio 2008 SDK libがインストールされている必要があります。このライブラリは、Visual Studioがインストールされているすべての開発マシンで使用できますが、サーバーに初めてアクセスすると、あいまいなエラーが発生します。これは、ほとんどの人がスクリプト化/自動化することのない、厄介な問題の1つです。将来のサーバー移行の際には、この問題につまずくでしょう。

最も古い回答

私は周りを掘り下げて、Cプロジェクトを翻訳してC#JPEGエンコーダを実装するプロジェクトに出会いました:

http://www.codeproject.com/Articles/83225/A-Simple-JPEG-Encoder-in-C

これを少し簡略化しました:

https://github.com/b9chris/ArpanJpegEncoder

.Netビルトインよりもはるかに高品質のJPEGを生成しますが、それでもGimpやPhotoshopほど優れていません。ファイルサイズも大きくなる傾向があります。

BitMiracleの実装 は、.Net組み込みと同じ品質の問題と実質的に同一です。

PageSpeed ToolsのGoogleのjpeg_optimizer -一見 libjpeg のような既存のオープンソース実装をラップするだけが最も効率的なオプションです。

更新

ArpanJpegEncoderをデプロイすると問題が発生するようです。コードの信頼レベルを上げる必要があるか、何か他のことが行われている可能性があります。ローカルでは画像を正常に書き込みますが、展開すると毎回空の黒い画像が表示されます。原因を特定したら更新します。それを考慮している他の人への警告です。

19
Chris Moschini

圧縮と品質は常にトレードオフです。

JPEGは常に損失が大きくなります。

PNGを使用し、PNGCrushまたは PNGauntlet を使用してファイルを縮小することを検討してください。

6
John Gietzen

.NETでの圧縮レベルの設定については、次のリンク(すべてが含まれています)を確認してください。 http://msdn.Microsoft.com/en-us/library/bb882583.aspx

質問を整理する:通常、ユーザーからアップロードされた画像をPNGとして保存し、このPNGをベースとしてさまざまなサイズのJPGを生成します(元のPNGには決して透かしを入れません!)これは、プラットフォームの画像サイズを後で変更する場合、元のPNGを保存して、これに基づいて新しい画像サイズを再計算できます。

2
johngrinder

元の品質とサイズのようにファイルを保存する必要があります

それはあまり意味がありません。非可逆圧縮を使用している場合、定義により一部の情報が失われます。画像を圧縮するポイントは、ファイルサイズを小さくすることです。高品質が必要で、jpegがそれを行っていない場合は、ある種のロスレス圧縮を使用する必要がありますが、ファイルサイズはそれほど小さくなりません。あなたはいつも「標準」ライブラリを使用してjpegに圧縮することを試みることができます( libjpeg) フード。)

0
Ed S.

Jpeg形式をその性質によって圧縮すると、品質が低下します。おそらく #ziplib などのファイル圧縮を検討する必要があります。ファイルのグループに対して適切な圧縮を取得できる場合があります。

0
C. Ross