2008-09-03 11 views
48

bmpイメージをjpg/pngに変換する方法はありますか?C#で品質を失うことはありませんか? Imageクラスを使用すると、bmpをjpgに変換できますが、出力イメージの品質は非常に悪いです。最高品質のPhotoshopを使用してjpgに変換された画像ほどの品質レベルを得ることはできますか?C#のjpg/pngへのBMP

答えて

53
var qualityEncoder = Encoder.Quality; 
var quality = (long)<desired quality>; 
var ratio = new EncoderParameter(qualityEncoder, quality); 
var codecParams = new EncoderParameters(1); 
codecParams.Param[0] = ratio; 
var jpegCodecInfo = <one of the codec infos from ImageCodecInfo.GetImageEncoders() with mime type = "image/jpeg">; 
bmp.Save(fileName, jpegCodecInfo, codecParams); // Save to JPG 
+1

ここには_using_ステートメントがありませんか?私はEncoderParameterがIDisposableであることに気づいていますが、私は使い捨てパターンが必要であると確信するための十分なマスターではありません。 1行でGetEncoderため – TwainJ

3

Thisそれはあなたを助けるかもしれないいくつかのソースコードを持っているように私はあなただけの品質のエンコーダパラメータにあなたが試すことができ< すくめ>

0

欠落していた疑いがある...になります。

Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic; 

をし、

Bitmap.CompositingQuality = CompositingQuality.HighQuality; 

品質はかなり高いですが、最高のものではありませんル。

+0

ビットマップにはこのようなプロパティはありません。 Graphicsに適用する必要があります。 –

1

基本的には、jpgは可能な限り最高の品質設定であっても、(私が知る限り)常に損失がありますので、同じ品質を保つことはできません。

ビット精度が本当に重要な場合は、ロスレスモードがいくつかあるpngの使用を検討してください。

1

JPEGは本質的に損失の多いフォーマットです。だから、たとえ最高の設定であっても、情報が失われることはありますが、画像にはかなりの違いがあります。しかし、pngはロスレスです。

30
public static class BitmapExtensions 
{ 
    public static void SaveJPG100(this Bitmap bmp, string filename) 
    {    
     EncoderParameters encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
     bmp.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    public static void SaveJPG100(this Bitmap bmp, Stream stream) 
    { 
     EncoderParameters encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
     bmp.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    public static ImageCodecInfo GetEncoder(ImageFormat format) 
    { 
     ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 

     foreach (ImageCodecInfo codec in codecs) 
     { 
      if (codec.FormatID == format.Guid) 
      { 
       return codec; 
      } 
     } 

     return null; 
    } 
} 
+0

等価な式: '' ')(ImageCodecInfo.GetImageDecodersを返す場合は(X => x.FormatID == format.Guid).FirstOrDefault();' '' – Nuzzolilo

+2

あるいは短い '復帰ImageCodecInfo.GetImageEncoders()。FirstOrDefault(x => x.FormatID == ImageFormat.Jpeg.Guid); '。 – Jan

10

jestroのBitmapExtensionsは素晴らしいです、私はそれらを使用しました。しかし、修正されたバージョンを表示したい - 私が考えると品質を提供するための方法を提供して、より便利である画像親クラスのための作品:

public static class ImageExtensions 
{ 
    public static void SaveJpeg(this Image img, string filePath, long quality) 
    { 
     var encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
     img.Save(filePath, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    public static void SaveJpeg(this Image img, Stream stream, long quality) 
    { 
     var encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, quality); 
     img.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    static ImageCodecInfo GetEncoder(ImageFormat format) 
    { 
     ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders(); 
     return codecs.Single(codec => codec.FormatID == format.Guid); 
    } 
} 
0

私は、経費報告書のアプリに取り組んでいます、と私は本当に嬉しく思いますBitmapオブジェクトから保存するときのJPG(およびPNG)のデフォルトの品質設定を使用します。

https://msdn.microsoft.com/en-us/library/9t4syfhh%28v=vs.110%29.aspx

Bitmap finalBitmap = ....; //from disk or whatever 
finalBitmap.Save(xpsFileName + ".final.jpg", ImageFormat.Jpeg); 
finalBitmap.Save(xpsFileName + ".final.png", ImageFormat.Png); 

私は、おそらく品質は、後続のフレームワークのリリースで改善されました... .NET 4.6でよ。

関連する問題