程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> GDI+ 在Delphi程序的應用 -- 仿Photoshop的明度調整

GDI+ 在Delphi程序的應用 -- 仿Photoshop的明度調整

編輯:關於SqlServer
  這幾天研究了一下Photoshop的色相/飽和度命令,也就是所謂的HSB顏色模式,沒完全搞明白,網上搜索也沒一點結果,看了一些介紹HSB算法的文章,其實講的就是HSV或者HSL的算法。

        關於PS色相/飽和度中的色相,就不用研究了,原理和HSV或者HSL的H都是一樣的。

        而飽和度在-100,0,+100這三點上的效果與HSL完全一樣,其它范圍就有區別了,特別是在0 -- +100范圍,調整時比HSL的H調整要平坦,所以有效調整幅度較大,有些圖片調整到+50%以上還不覺很大失真(這裡的“失真”是針對顏色中難看的斑點來說的,並不是說整個圖片不覺失真),而HSL的H的正向調整10%以上就很難看了;與HSV則沒一點是相同的,可見PS的色相/飽和度算法應該是在HSL基礎上改進的。

        最令人困惑的是PS的明度調整,好像是“獨立”於色相飽和度的。我們知道,要在程序中利用HSV或HSL模式調整V或者L,往往要先將RGB轉換為HSV或HSL,或者至少要在其中將V或者L部分分離出來,修改後再轉換為RGB模式(可參見我的文章《GDI+ 在Delphi程序的應用 -- 線性調整圖像亮度 》分離HSL的L部分調整亮度),而PS的明度調整則不一樣,完全不用轉換RGB到所謂的HSB進行調整,直接寫個函數就可以了,請看下面的Delphi過程及測試代碼(分別用GDI+的TGpBitmap和Delphi的TBitmap測試),用於模仿PS明度調整(嚴格的說不叫模仿,而是實實在在的PS明度調整過程):




procedure PSBrightness(Data: TBitmapData; Value: Integer);
asm
    push    ebp
    push    esi
    push    edi
    push    ebx
    mov     ebp, eax
    mov     esi, [ebp + 16]
    mov     eax, [ebp]
    shl     eax, 1
    add     eax, [ebp]
    mov     ebx, [ebp + 8]
    sub     ebx, eax
    mov     [ebp + 20], ebx
    mov     ecx, [ebp + 4]
  @yLoop:
    push    ecx
    mov     edi, [ebp]
  @xLoop:
    mov     ecx, 3
  @vLoop:
    push    edx
    movzx   eax, [esi]
    test    edx,
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved