研究 Photoshop 「色相/飽和度」命令發現:
傳統做法:RGB → HSL/HSV → 調整 L/V → 轉回 RGB,效能差且易失真。
PS 做法:直接對每個像素的 R/G/B 分量按比例縮放,無顏色空間轉換開銷。
procedure PSBrightness(Data: TBitmapData; Value: Integer); asm push ebp push esi push edi push ebx mov ebp, eax // Data 記錄指標 mov esi, [ebp + 16] // 像素資料指標 mov eax, [ebp] // Width shl eax, 1 // *2 add eax, [ebp] // +Width = Width*3 (每列位元組數) mov ebx, [ebp + 8] // Height sub ebx, eax // 調整後的行跨度 mov [ebp + 20], ebx // 存回 mov ecx, [ebp + 4] // Height @yLoop: push ecx mov edi, [ebp] // Width @xLoop: mov ecx, 3 // R/G/B 三通道 @vLoop: push edx movzx eax, [esi] // 讀取通道值 test edx, edx // Value 正負判斷 jl @Negative // 正向亮度:value > 0 add eax, edx cmp eax, 255 jle @Clamped mov eax, 255 jmp @Clamped @Negative: // 負向亮度:value < 0 add eax, edx // edx 為負 jge @Clamped xor eax, eax // 截斷到 0 @Clamped: mov [esi], al // 寫回 inc esi pop edx dec ecx jnz @vLoop dec edi jnz @xLoop pop ecx add esi, [ebp + 20] // 跳到下一列 dec ecx jnz @yLoop pop ebx pop edi pop esi pop ebp end;
Value 範圍:-255 ~ +255(對應 PS -100% ~ +100%)新值 = 舊值 + Value,上限 255新值 = 舊值 + Value,下限 0分別使用 TGpBitmap (GDI+) 與 TBitmap (VCL) 測試,結果與 Photoshop 明度調整像素級一致。
PS 明度調整本質是通道級線性增益/衰減,非色彩空間轉換。組語實現極致效能,適合即時影像處理、批量圖片調整等場景。理解這一原理,可避開不必要的 HSV/HSL 轉換開銷。