C++Builder 的 TCanvas::Pixels 屬性雖方便存取單一像素,但逐點呼叫極其低效。本文展示以 ScanLine 逐行存取、3x3 卷積核為基礎的三種經典影像特效——柔化(平滑)、銳化、浮雕——的完整實作,並說明邊界處理、數值飽和、效能優化要點。
struct RGB { BYTE r, g, b; };
RGB** rgb; // [width][height] 原始像素快取
Graphics::TBitmap* bmpDst; // 輸出位圖
int w, h;
void __fastcall TForm1::LoadImage() {
if (!OpenPictureDialog1->Execute()) return;
Image1->Picture->LoadFromFile(OpenPictureDialog1->FileName);
w = Image1->Width; h = Image1->Height;
rgb = new RGB*[w];
for (int x=0; xPicture->Bitmap->ScanLine[y];
for (int x=0; xWidth = w; bmpDst->Height = h;
bmpDst->PixelFormat = pf24bit;
}
void ApplyKernel(const int kernel[3][3], int divisor, int bias = 0) {
for (int y=1; yScanLine[y];
for (int x=1; x255)?255:r;
g = (g<0)?0:(g>255)?255:g;
b = (b<0)?0:(b>255)?255:b;
dst[x*3+2] = r; dst[x*3+1] = g; dst[x*3+0] = b; // BGR
}
}
Image1->Picture->Bitmap->Assign(bmpDst);
}
| 特效 | 卷積核 | 除數 | 偏移 | 說明 |
|---|---|---|---|---|
| 柔化 | 全 1,中心 8(或全 5,中心 60) | 9 (或 100) | 0 | 鄰域平均,降低高頻雜訊 |
| 銳化 | 對角線差分:中心 1+degree,對角 -degree | 1 | 0 | 增強邊緣,degree=0.3~0.5 |
| 浮雕 | 對角線差分:中心 1,對角 -1 | 1 | 128 | 凸顯輪廓,灰階中性 |
// 柔化
void __fastcall TForm1::btnSmoothClick(TObject*) {
int k[3][3] = {{5,5,5},{5,60,5},{5,5,5}};
ApplyKernel(k, 100);
}
// 銳化
void __fastcall TForm1::btnSharpenClick(TObject*) {
float d = 0.3f;
int k[3][3] = {{0,0,0},{0,1+d,-d},{0,0,0}}; // 簡化版:僅用左上對角
// 完整版需 3x3 浮點核,此處示範整數近似
ApplyKernel(k, 1);
}
// 浮雕
void __fastcall TForm1::btnEmbossClick(TObject*) {
int k[3][3] = {{-1,-1,0},{-1,1,1},{0,1,1}};
ApplyKernel(k, 1, 128);
}
Pixels[x][y] 每次觸發邊界檢查與格式轉換,ScanLine 直接操作記憶體,快 50~100 倍。int,最後除以 100。BYTE clamp[512] 替代 if 分支。#pragma omp parallel for 處理不同掃描線區段。__m128i 並行處理 8 個像素。degree掌握 ScanLine 記憶體佈局(24-bit BGR、每行 4 位元組對齊)、3x3 卷積通用框架、整數飽和運算,即可在 C++Builder 高效實作多種影像特效。完整專案含即時預覽、參數滑桿調整,歡迎下載原始碼深入研究。