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

GDI+ Delphi 圖像亮度/對比度調整:灰度統計與聯合調整演算法完整實現

     編輯:關於SqlServer

演算法探索歷程

  • 網上常見亮度/對比度演算法過於簡單,實際效果差
  • 逆向分析 Photoshop 算法:對比度調整按正負分支,亮度調整依對比度正負而異
  • 單獨調整各完美,但**合併必須統一在單一函數中**
  • 需引入灰度直方圖統計作為對比度調整參考基準

核心資料結構

type
  TImageGrayArray = array[0..255] of LongWord;  // 256 灰度級計數

三階段處理流程

  1. 灰度統計:掃描全圖,建立 256 灰度級像素計數陣列
  2. 對比度調整:基於灰度分佈計算映射曲線,正負對比度分不同公式
  3. 亮度調整:在對比度調整後疊加,正負亮度亦分支處理

灰度統計 BASM 實現(節錄)

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 慢速
  • 24bpp RGB 格式:每像素 3 位元組,記憶體連續,向量化友好
  • Stride 處理:每行實際位元組數 = Width * 3 對齊到 4 位元組邊界
  • BASM 優化:整數定點運算、迴圈展開、暫存器分配、分支預測優化

測試驗證

  • 對比 Photoshop 同參數下輸出,**像素級一致**
  • 支援大圖(萬像素級),處理時間 < 100ms(現代 CPU)
  • 可擴展至對比度/亮度/飽和度/色相四參數聯合調整

原始碼結構

// 核心單元
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+ 應用專案。

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