本人已經寫過幾篇關於亮度調整的文章,但是關於圖像的對比度調整的過程和文章卻一直沒有寫,其原因是一直沒找到一個好的算法。可能有人會說,圖像的亮度,對比度調整是最簡單的圖形操作,其算法網上可說是一搜一大把,確實如此,可就是這最簡單的操作,網上的文章卻五花八門,我揀幾個試了一下,好像都不太理想,關鍵是算法太簡單,實際操作效果不好,於是想,Photoshop的對比度還是較好的,而且也通用,但偏偏網上沒有介紹它的算法,用了大半天時間研究了一下,再花了1個來小時寫了個Delphi過程,試了一下,居然和Photoshop的對比度調整完全一樣的效果!於是認真寫了個測試程序,把亮度和對比度放在一起進行調整(亮度和對比度處理過程為各自獨立的,其中亮度過程基本是本BLOG文章《
GDI+ 在Delphi程序的應用 -- 調整圖像亮度》的代碼),可是效果卻和Photoshop大不一樣了,是什麼原因呢,Photoshop的亮度調整算法是最簡單的那種,與我的亮度過程做出來的是一樣的(效果比較圖參見《
GDI+ 在Delphi程序的應用 -- 線性調整圖像亮度》),而前面說了,對比度過程算法也是和Photoshop一樣的,可放在一起調整就不行了,無論是先調整亮度,還是先調整對比度都這樣。後來仔細分析了一下,Photoshop是用一個函數處理亮度/對比度,而且亮度調整是按對比度的正負分別對待的,沒辦法,只好將2個過程合並,再加上個灰度統計過程,代碼很長的(依然是BASM寫的,有人對我說,為什麼不用純Pascal寫,我試著用Pascal寫過,有些處理太慢了,後面我把基本算法用偽代碼寫出來,喜歡用純Pascal或者C/C++的可以自己去寫):
type
TImageGrayArray = array[0..255] of LongWord;
procedure SumGray(Data: TBitmapData; var Grays: TImageGrayArray; IsGpBitmap: Boolean);
asm
push ebp
push esi
push edi
push ebx
sub esp, 12
mov ebp, eax
mov edi, edx
mov [esp + 4],