2009-01-22 38 views
2

希望儘可能少的損失,因爲我聽說一個叫Guido Vollbeding的人提出的實施。標準GDI +似乎沒有這種能力,到目前爲止我發現的所有內容都是規範或完全集成的工具。一個精簡的,可插拔的.NET組件將非常可取。如果涉及到我自己實現它,那麼常見的陷阱是什麼?有沒有辦法在.NET中將jpeg快速調整爲其原始大小的1/8?

每一個想法和指導表示讚賞!

編輯:我的目的是繞過明顯的解壓縮到.NET位圖的循環,調整它的大小,然後再次壓縮它。這article似乎指向正確的方式,但到目前爲止,我從來沒有見過任何.NET實現

回答

2

這是使用.NET Bitmap類很簡單:

void ResizeImage(string inFname, string outFname, float scale) 
{ 
    Bitmap bmpOrig = new Bitmap(inFname); 
    int w = (int)(scale * bmpOrig.Width); 
    int h = (int)(scale * bmpOrig.Height); 
    Bitmap bmpNew = new Bitmap(bmpOrig, new Size(w, h)); 
    bmpNew.Save(outFname, ImageFormat.Jpeg); 
} 

你需要添加一個對System.Drawing的引用,並且在你的代碼中同時使用System.Drawing和System.Drawing.Imaging:

我不能說將會有多少損失。

+0

我一直在使用通用的簡單調整大小。我的問題是在特殊情況下加快速度,在這種情況下更好的算法可以利用1/2,1/4,1/8的縮減比例。 – 2009-01-22 04:58:07

0

我不知道任何具體處理1 /(2^n)的算法,但是如果你能找到一個你需要能夠鎖定位圖上的位(如果你想要任何合理的形式速度)。使用set/get像素是一個糟糕的主意。

Clickety

0

加載到內存中的位圖,然後獲取其數據,並使用不安全的代碼,寫入就像是C++來調整其大小。 Here是我學習如何快速調整圖像大小(我不認爲鏈接調整大小,但它會告訴你如何在.Net中編寫快速圖像代碼)

設置一個斷點並逐步執行代碼反彙編窗口會告訴你你是怎麼做的。避免任何數組訪問,只需使用指針,數組訪問就是死亡之吻,以便在.Net中執行嚴格的性能循環(因爲有一個檢查索引是否在邊界內,然後是有條件跳轉來拋出Every。Single 。訪問。)

相關問題