我最近通過文章image processing in C#使不安全的代碼在C#安全
閱讀有一個在那裏,我真的不喜歡,因爲它是不安全的,我想一些代碼知道它是否能進行安全:
public static bool Invert(Bitmap b)
{
// GDI+ still lies to us - the return format is BGR, NOT RGB.
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
unsafe
{
byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3;
int nWidth = b.Width * 3;
for(int y=0;y < b.Height;++y)
{
for(int x=0; x < nWidth; ++x)
{
p[0] = (byte)(255-p[0]);
++p;
}
p += nOffset;
}
}
b.UnlockBits(bmData);
return true;
}
行byte* p = (byte*)(void*)Scan0;
模樣的罪魁禍首,但我不得不說,我真的不明白它在做什麼,或者它如何可以作出安全。
任何人都可以對此有所瞭解嗎?
如果你不知道它在做什麼,爲什麼你想「讓它安全」?你害怕「不安全」這個詞嗎?該代碼用於使用指針直接訪問內存中的位圖像素。另一種方法是使用GetPixel()來編組每個像素的數據,速度非常慢。 – CodeCaster
'Scan0'是一個'IntPtr',所以如果你想獲得相同的處理速度,你基本上必須使用指針。 –
「我怎樣才能讓它不安全?」 - 停止使用指針。如果你不知道_why_它的使用標記,那麼就不要惹它(或找到某人知道它在做什麼和_why_)。 –