2008-09-03 61 views
48

有什麼辦法可以將bmp圖像轉換成jpg/png而不會丟失C#中的質量?使用Image類我們可以將bmp轉換爲jpg,但輸出圖像的質量非常差。我們可以通過使用最高質量的photoshop將圖像轉換爲jpg來獲得質量水平嗎?Bmp到jpg/png在C#

回答

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的,但我不是掌握足夠的一次性模式來確定它們是否需要。在一行 – TwainJ 2011-11-15 19:37:24

3

This看起來有一些源代碼,可以幫助你......我懷疑你只是缺少質量編碼器參數< 聳肩>

0

你可以試試:

Bitmap.InterpolationMode = InterpolationMode.HighQualityBicubic; 

Bitmap.CompositingQuality = CompositingQuality.HighQuality; 

哪個確保質量相當高,但不是最高的可能性樂。

+0

位圖沒有這樣的屬性。它們必須應用於圖形和圖像修改期間,例如調整大小。 – 2012-01-02 17:36:12

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

等效表達式GetEncoder: ```返回ImageCodecInfo.GetImageDecoders()其中(x => x.FormatID == format.Guid).FirstOrDefault();``` – Nuzzolilo 2015-05-21 22:59:31

10

提供BitmapExtensions通過jestro是偉大的,我用他們。但是想顯示修正版本 - 適用於因爲我認爲這是更方便,提供了一種方法來提供高質量的圖像父類:

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 ...也許是質量在隨後的框架的版本有所提升。