type
TImageGrayArray = array[0..255] of LongWord; // 256 灰度級計數
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 // Data, Grays
// ... 完整代碼見原文,關鍵點:
// 1. 支援 GpBitmap (pf24bppRGB) 與 TBitmap 兩種資料結構
// 2. 逐像素計算灰度:Gray = (R*30 + G*59 + B*11) / 100
// 3. 原子遞增 Grays[Gray]
// 4. 考慮 Stride(行跨度)與 Padding
end;
// 輸入:Contrast (-100~100), Brightness (-100~100)
// 1. 計算灰度直方圖 Grays[256]
// 2. 計算對比度映射表 Map[256]
if Contrast > 0:
// 增強對比度:S曲線,以中間灰度為樞紐
factor = tan((45 + Contrast*45/100) * PI/180)
for i in 0..255:
Map[i] = 128 + factor * (i - 128)
else:
// 降低對比度:線性壓縮
factor = 1 + Contrast/100 // 0~1
for i in 0..255:
Map[i] = 128 + factor * (i - 128)
// 3. 疊加亮度
if Brightness > 0:
for i in 0..255:
Map[i] = Map[i] + (255 - Map[i]) * Brightness/100
else:
for i in 0..255:
Map[i] = Map[i] + Map[i] * Brightness/100 // 負值
// 4. 限制 0-255 並應用到每個像素 R/G/B 通道
LockBits/UnlockBits 直接存取,避免 GetPixel/SetPixel 慢速Width * 3 對齊到 4 位元組邊界// 核心單元
unit ImageAdjust;
interface
procedure AdjustBrightnessContrast(Bmp: TGpBitmap; Contrast, Brightness: Integer);
procedure AdjustHSB(Bmp: TGpBitmap; Hue, Saturation, Brightness: Integer);
implementation
// SumGray, BuildMap, ApplyMap 三個 BASM 過程
end.
此實現解決了亮度/對比度聯合調整的核心難題,達到專業級圖像處理效果,可直接整合至 Delphi/GDI+ 應用專案。