2017-09-04 95 views
0

我用這個link來增加我的程序調整圖像亮度的能力。此代碼是可以的,但需要時間調整亮度(圖像文件大小1.8mb)。當我嘗試較低質量的圖像時,它會立即調整圖像(圖像文件大小爲100KB)。是否有任何有效的方法來調整圖像的亮度。大圖像的圖像亮度c#

+0

您可以使用更低級別的方法對其進行編輯。 http://www.vcskicks.com/fast-image-processing.php – leAthlon

+0

與大型圖像(100 kB vs 1.8 MB)相比,您在處理非常小的圖像時總會有所不同。那麼你對這個問題的解決方案有什麼期望? – Fildor

+1

該代碼似乎在常規位圖上使用SetPixel。這是一個糟糕的主意,因爲它太慢了。而是使用a)LockBits或b)FastBitmap或c)ColorMatrix!大量的例子在這裏和網絡.. – TaW

回答

2

該代碼似乎使用GetPixelSetPixel定期Bitmaps。這是一個壞主意,因爲它太慢了。

要操縱Bitmap的單個像素,必須鎖定它(Get/SetPixel在幕後執行),並以像素爲單位進行操作,這意味着對於1000x1000大小的圖像,一百萬次鎖定/解鎖操作必須是執行。這造成了巨大的開銷。

方法來避免這一

一種方法是鎖定與LockBits功能整個位圖。現在我們可以遍歷像素並修改它們。有關此方法的

兩個附註:

  • 我們現在訪問是每個像素的原始字節,即每個信道單獨:要麼BGR或BGRA,根據像素格式。這意味着通道是與Color方法的通常RGB/ARGB格式物理相反

  • 要遍歷物理位圖像素行,我們還需要爲每行添加一些stride,這些行將行填充爲4個字節的倍數。此外see here

對於一些例子,你可能想瀏覽過some of these posts。請特別注意this one,它使用委託來實現靈活的操作!

(請注意,有幾個職位使用2個或甚至3鎖定位圖,因爲他們瞄準的合成圖像。)

方法二

另一種方式來解決鎖定一個像素的開銷一個是現成的位圖類,通過將自己鎖定爲一個整體來提供幫助。 Herehere是我沒有嘗試自己的例子。

方法三

最後有圖像處理,這既是相當簡單和真快一個非常優雅的方法;也專業製作以獲得最佳效果:您可以設置一個ColorMatrix

它可以讓你改變亮度,伽馬,色調,然後一些。 Here is a very nice introduction

唯一的缺點是,這僅限於一些固定的操作,所以您不能爲其他奇特的東西創建自定義過濾器,如photoshop-type layer modes或其他,特別是那些需要處理相鄰像素的過濾器。模糊..

但是,如果你想要的只是改變亮度,這是我會推薦!