首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

GDI+ 在 Delphi 實現 Photoshop 級明度調整算法

     編輯:關於SqlServer

背景:HSB/HSL/HSV 的困惑

研究 Photoshop 「色相/飽和度」命令發現:

  • 色相 (H):與 HSV/HSL 的 H 一致
  • 飽和度 (S):-100/0/+100 三點與 HSL 完全一致,但 0~+100 範圍調整更平緩,有效幅度更大
  • 明度 (B/L/V):PS 的明度調整獨立於色相/飽和度,不需 RGB↔HSB 轉換,直接像素級運算即可

核心發現:PS 明度調整純屬線性像素運算

傳統做法:RGB → HSL/HSV → 調整 L/V → 轉回 RGB,效能差且易失真。
PS 做法:直接對每個像素的 R/G/B 分量按比例縮放,無顏色空間轉換開銷。

Delphi 純組語實現(高效能)

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
  • 逐像素、逐通道處理,無分支預測失誤優化
  • 適用於 24-bit RGB (3 bytes/pixel),32-bit 需微調

測試驗證

分別使用 TGpBitmap (GDI+) 與 TBitmap (VCL) 測試,結果與 Photoshop 明度調整像素級一致。

總結

PS 明度調整本質是通道級線性增益/衰減,非色彩空間轉換。組語實現極致效能,適合即時影像處理、批量圖片調整等場景。理解這一原理,可避開不必要的 HSV/HSL 轉換開銷。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved