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

C# BitmapData 影像處理實例:像素級操作與 Stride 解析

     編輯:關於C語言

背景

Bitmap.GetPixel/SetPixel 效能極差。BitmapData 配合 LockBits 可直接存取記憶體,適合大量像素運算。

範例:負片效果(每通道 255 - 原值)

int h = bmp.Height, w = bmp.Width;
Bitmap bmpOut = new Bitmap(w, h, PixelFormat.Format24bppRgb);
BitmapData dataIn = bmp.LockBits(new Rectangle(0,0,w,h), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
BitmapData dataOut = bmpOut.LockBits(new Rectangle(0,0,w,h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

unsafe
{
    byte* pIn = (byte*)dataIn.Scan0.ToPointer();
    byte* pOut = (byte*)dataOut.Scan0.ToPointer();
    for (int y = 0; y < dataIn.Height; y++)
    {
        for (int x = 0; x < dataIn.Width; x++)
        {
            pOut[0] = (byte)(255 - pIn[0]); // B
            pOut[1] = (byte)(255 - pIn[1]); // G
            pOut[2] = (byte)(255 - pIn[2]); // R
            pIn += 3; pOut += 3;
        }
        pIn += dataIn.Stride - dataIn.Width * 3;
        pOut += dataOut.Stride - dataOut.Width * 3;
    }
}
bmpOut.UnlockBits(dataOut);
bmp.UnlockBits(dataIn);

Stride 解析

  • Width:影像寬度(像素數)。
  • Stride:每行實際佔用的位元組數,為 4 的倍數(記憶體對齊)。
    例:寬 6 像素 × 3 位元組 = 18,非 4 倍數 → Stride = 20,每行尾部補 2 位元組 padding。
  • Scan0:第一像素第一通道(B)的記憶體位址。

記憶體配置示意

Scan0
|------------------ Stride ------------------|
|---------- Width (pixels) ----------|
B G R B G R B G R B G R B G R X X   <- 第 1 列
B G R B G R B G R B G R B G R X X   <- 第 2 列
...

注意事項

  • 專案屬性 → Build → 勾選「Allow unsafe code」。
  • 鎖定區域建議與影像完整尺寸一致,避免座標換算錯誤。
  • 處理完成必須呼叫 UnlockBits 釋放鎖定。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved