Bitmap.GetPixel/SetPixel 極度低效,處理 500 萬像素圖片可能需數分鐘。正解:LockBits 鎖定記憶體區域,直接操作原始位元組。
for (int y=0; y
FileStream fs = new FileStream(image, FileMode.Open, FileAccess.Read);
Image img = Image.FromStream(fs, false, false);
Bitmap bmp = new Bitmap(img);
img.Dispose(); fs.Close();
int w = bmp.Width, h = bmp.Height; // 避免重複存取屬性
BitmapData bmData = bmp.LockBits(new Rectangle(0,0,w,h), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
byte* p = (byte*)bmData.Scan0;
int offset = bmData.Stride - w * 3; // Format24bppRgb 每像素 3 bytes
for (int y=0; y
p[2] += 20 可能溢位。安全寫法:p[2] = (byte)Math.Min(byte.MaxValue, p[2] + 20); 或 checked((byte)(p[2]+20))。LockBits 速度已接近原生 GDI,一般應用足夠。