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);
私はスタジオの写真をアーカイブしています。品質と圧縮は非常に重要です。ありがとう。
品質を100%に設定しているようです。つまり、圧縮は行われません。
圧縮レベル(80、50など)を変更し、品質に満足できない場合は、別の画像ライブラリを試してください。 LEADTools には、優れた(非フリー)エンジンがあります。
更新:コメンターが述べたように、100%の品質は、JPEGを使用する場合でもロスレス圧縮を意味しません。画像を読み込んで何かをしてから、再度保存すると、最終的に画像が劣化します。データを失わずに画像を変更して保存する必要がある場合は、TIFF、PNG、BMPなどのロスレス形式を使用する必要があります。圧縮されたTIFF(圧縮されていてもロスレスであるため)またはPNGを使用します。
ライブラリ(少なくともMicrosoftが提供するデフォルトのWindowsライブラリ)に組み込まれた.Netエンコーダーはかなり悪いです:
http://b9dev.blogspot.com/2013/06/nets-built-in-jpeg-encoder-convenient.html
私は現在、 ここで概説されているアプローチ を使用しています。これは、サイズ変更にImageMagickを使用し、最終圧縮にjpegoptimを使用し、はるかに良い結果をもたらします。私はそれが部分的な答えであることを理解していますが、時間が許せばこれについて詳しく説明します。
ImageMagickは、これまでに見つけた最良の選択です。比較的強固なjpeg圧縮を実行します。
欠点がいくつかあります。
優れていますが、完璧ではありません。特に、そのクロマサブサンプリングは90%以上の高詳細度に設定され、それから詳細度の低いレベルにジャンプします-これは多くのアーティファクトをもたらす可能性があります。サブサンプリングを無視したい場合、これは実際には非常に便利です。しかし、たとえば50%の高詳細なサブサンプリングが必要な場合は、さらに大きな課題があります。また、PhotoshopまたはGoogle PageSpeedの品質/圧縮レベルにはまだそれほど影響しません。
サーバーには特別な展開の負荷があり、見逃しがちです。 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をデプロイすると問題が発生するようです。コードの信頼レベルを上げる必要があるか、何か他のことが行われている可能性があります。ローカルでは画像を正常に書き込みますが、展開すると毎回空の黒い画像が表示されます。原因を特定したら更新します。それを考慮している他の人への警告です。
.NETでの圧縮レベルの設定については、次のリンク(すべてが含まれています)を確認してください。 http://msdn.Microsoft.com/en-us/library/bb882583.aspx
質問を整理する:通常、ユーザーからアップロードされた画像をPNGとして保存し、このPNGをベースとしてさまざまなサイズのJPGを生成します(元のPNGには決して透かしを入れません!)これは、プラットフォームの画像サイズを後で変更する場合、元のPNGを保存して、これに基づいて新しい画像サイズを再計算できます。
元の品質とサイズのようにファイルを保存する必要があります
それはあまり意味がありません。非可逆圧縮を使用している場合、定義により一部の情報が失われます。画像を圧縮するポイントは、ファイルサイズを小さくすることです。高品質が必要で、jpegがそれを行っていない場合は、ある種のロスレス圧縮を使用する必要がありますが、ファイルサイズはそれほど小さくなりません。あなたはいつも「標準」ライブラリを使用してjpegに圧縮することを試みることができます( libjpeg) フード。)
Jpeg形式をその性質によって圧縮すると、品質が低下します。おそらく #ziplib などのファイル圧縮を検討する必要があります。ファイルのグループに対して適切な圧縮を取得できる場合があります。