提及 .NET 指標操作,很多人不太了解,甚至不知道有這個東西。由於 C# 指標操作屬於 unsafe,所以許多人使用時很謹慎。其實所謂不安全程式碼,是不受 CLR 控制的非託管執行,相當於 CLR 領導下的部分區域自治,CLR 也不會關心不安全程式碼的記憶體配置與回收。
廢話少說,先體驗適當指標操作帶來的效能提升。平時透過 GDI+ 操作稍大點圖片像素時,都有種瀕臨崩潰感覺,我們轉用指標操作:
Bitmap map = new Bitmap(path);
// 將圖片位圖區域鎖定
BitmapData mapdata = map.LockBits(new Rectangle(0, 0, map.Width, map.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
unsafe
{
byte* pixpoint;
int newpoint;
for (int i = 0; i < map.Width; i++)
{
for (int j = 0; j < map.Height; j++)
{
// 位圖結構存在位元組對齊問題
pixpoint = (byte*)mapdata.Scan0 + i * 3 + j * mapdata.Stride;
newpoint = (*pixpoint * 11 + *(pixpoint + 1) * 59 + *(pixpoint + 2) * 30) / 100;
*(pixpoint++) = (byte)newpoint;
*(pixpoint++) = (byte)newpoint;
*(pixpoint++) = (byte)newpoint;
// 非指標操作
// Color pxcl = map.GetPixel(i, j);
// map.SetPixel(i, j, (pxcl.R * 11 + pxcl.G * 59 + pxcl * 30) / 100);
}
}
}
// 解鎖位圖記憶體區域
map.UnlockBits(mapdata);
map.Dispose();