2010-04-20 93 views
5

我見過很多人試圖編寫自己的圖像轉換技術。它通常看起來非常複雜,並最終使用GDI +函​​數調用,並操縱圖像的位。這讓我想知道如果我在保存圖像時錯過了.NET的圖像轉換調用的簡單性。這裏是我的代碼:是否足夠使用.NET Image Conversion?

Bitmap tempBmp = new Bitmap("c:\temp\img.jpg"); 
Bitmap bmp = new Bitmap(tempBmp, 800, 600); 
bmp.Save(c:\temp\img.bmp, //extension depends on format 
    ImageFormat.Bmp) //These are all the ImageFormats I allow conversion to within the program. Ignore the syntax for a second ;) 
    ImageFormat.Gif) //or 
    ImageFormat.Jpeg) //or 
    ImageFormat.Png) //or 
    ImageFormat.Tiff) //or 
    ImageFormat.Wmf) //or 
    ImageFormat.Bmp)//or 
    ); 

這就是我在圖像轉換中所做的一切。只需設置圖像保存位置,並將其傳遞給ImageFormat類型即可。我已經測試了它的最佳效果,但是我想知道如果我在這個簡單的格式轉換中丟失了什麼,或者如果這足夠了?

回答

5

System.Drawing.Imaging確實爲您提供了對圖像壓縮的額外控制,如果您通過JPEG編碼解碼器併爲質量設置編碼器參數(實質上爲百分比保留)。

下面是我使用參數"image/jpeg"獲取JPEG編解碼器的功能。 (這是不相關的壓縮本身,但Image.Save重載接受EncoderParameters需要ImageCodecInfo而不是ImageFormat。)

// assumes an encoder for "image/jpeg" will be available. 
public static ImageCodecInfo GetCodec(string mimeType) 
{ 
    ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders(); 

    for(int i = 0; i < encoders.Length; i++) 
     if(encoders[i].MimeType == mimeType) 
      return encoders[i]; 

    return null; 
} 

然後,你可以保存圖像之前設置編碼器參數。

EncoderParameters ep = new EncoderParameters(2); 
ep.Param[0] = new EncoderParameter(Encoder.Quality, percentRetention); // 1-100 
ep.Param[1] = new EncoderParameter(Encoder.ColorDepth, colorDepth); // e.g. 24L 

(還有其他編碼器參數—請參閱文檔。

所以,把它放在一起,你可以說

image.Save(outFile, GetCodec("image/jpeg"), ep); 

(我存儲在靜態值的編解碼器和參數,因爲它們被用來一遍又一遍,但我想在這裏簡化的例子)

希望這有助於!

編輯:如果你縮放圖像,你也有一些質量控制。是的,這是非常「黑匣子」,但我發現它運作良好。以下是「好&慢」的設置(你需要調用的DrawImage之前設置的,但你可以看一下「快速&髒」的版本。

// good & slow 
graphics.SmoothingMode  = SmoothingMode.HighQuality; 
graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; 
graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; 
graphics.CompositingQuality = CompositingQuality.HighQuality; 
+0

+1回答。只是想指出的是,SmoothingMode不會影響圖像縮放,它會影響draigwng基元如線條,橢圓等。 – 2010-04-20 19:33:23

0

我認爲通過傳遞imageformat .NET爲您製作與ImageFormat相關的壓縮。

但是,當涉及到圖形壓縮時,可能會比這更多(請參閱Photoshop或圖形程序另存爲對話框作爲示例)。

JPEG例如只是一個標準......對於大量的網頁圖形,您仍然可以通過模糊或減少更多的顏色來減少尺寸,而不會造成明顯的質量損失。

將由您決定使用哪種技術,或者如果您對Standard有問題可以使用。

0

你在做什麼可以工作,但是迄今爲止效率並不高,也不會產生最經濟的文件大小。

您在處理成像時看到複雜的GDI代碼的原因是,在使用默認的一尺寸適合所有方法和甚至最適度的微調之間沒有合理的中間基礎。

The .net < - > gdi interop與黑魔法的邊界,其中隱約的錯誤比比皆是。幸運的是,谷歌擁有所有你需要瀏覽這個雷區的信息。

(做我畫一個可怕的畫面不夠?;-))

認真不過,你可以用GDI互操作做的相當好,但它絕不是一個明顯的任務。如果你願意做研究並花時間去解決這些問題,那麼你可以用一些好的代碼來結束。

否則找到一個圖像庫,爲你做這些事情。