我正在試驗一些使用unsafe
代碼的基本圖像處理。然後我訪問一個像素爲bmp.GetPixel
,這導致程序「停止工作」。我不知道如何調試。不安全的圖像處理導致程序退出
我是不是在Treshold方法中做了一些我應該做的事情?
var imageFilename = @"foo.jpg";
var im = (Bitmap)Bitmap.FromFile(imageFilename);
Threshold(im, 2);
// this line causes it to stop working without an exception
im.GetPixel(0,0);
static void Threshold(Bitmap bmp, int thresh)
{
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
unsafe
{
byte* p = (byte*)(void*)bmData.Scan0.ToPointer();
int h = bmp.Height;
int w = bmp.Width;
int ws = bmData.Stride;
for (int i = 0; i < h; i++)
{
byte* row = &p[i * ws];
for (int j = 0; j < w * 3; j += 3)
{
row[j] = (byte)((row[j] > (byte)thresh) ? 255 : 0);
row[j + 1] = (byte)((row[j + 1] > (byte)thresh) ? 255 : 0);
row[j + 2] = (byte)((row[j + 2] > (byte)thresh) ? 255 : 0);
}
}
}
bmp.UnlockBits(bmData);
}
更新:出於某種原因,我發現,使用不同的像素格式PixelFormat.Format24bppRgb
解決了這個問題。爲什麼?輸入圖像是灰度。
更多信息「你試過將其關閉並重新開啓?」 ...我無法複製您的問題 - 代碼可以按原樣運行,並且可以在調用GetPixel後保存生成的圖像...我嘗試了幾張圖像,可能是圖像相關的,可能是某種東西特定於您的設置。我正在使用VS2015社區版。無論哪種方式,這不是你的代碼。 – CoolBots
奇怪的是,在lockbits中使用'bmp.PixelFormat'嗎?我有一種偷偷摸摸的感覺,這可能與VS 2017 RC有關。 – user3791372
是的,你的代碼是這樣的。這個問題是灰度 - 它是一個16位每像素的圖像,而不是24位 - 您正在通過不安全的代碼讀取圖像。 – CoolBots