作者tkisky (FlyToast)
看板C_Sharp
標題[問題] 影像處理圖片寫入問題
時間Fri Nov 28 15:57:42 2008
這個程式是為了判斷一張圖片裡面中,r的平均值和r去做比對,
不知道是寫入圖片的地方錯了,出來的圖片就是全黑
麻煩板上的大大幫我看一下寫入的地方中的指標那裡有問題?
private void Form1_Load(object sender, EventArgs e)
{
pictureBox1.Image =
System.Drawing.Image.FromFile("C:/fire/3.jpg");
Bitmap bimage = pictureBox1.Image as Bitmap;
AForge.Imaging.RGB rgb = new RGB();
AForge.Imaging.ImageStatistics statistics = new
AForge.Imaging.ImageStatistics(bimage);
AForge.Math.Histogram histogram = statistics.Red; //這是取的r的平
均值
double mean = histogram.Mean;
label1.Text = mean.ToString();
BitmapData bmData = bimage.LockBits(new Rectangle(0, 0,
bimage.Width, bimage.Height),
ImageLockMode.ReadOnly,
PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
// Step 2: 取得像點資料的起始位址
System.IntPtr Scan0 = bmData.Scan0;
// 計算每行的像點所佔據的byte 總數
int ByteNumber_Width = bimage.Width * 3;
// 計算每一行後面幾個 Padding bytes
int ByteOfSkip = stride - ByteNumber_Width;
int Height = bimage.Height;
int Width = bimage.Width;
int[, ,] rgbData = new int[Width, Height, 3];
// Step 3: 直接利用指標, 把影像資料取出來
unsafe
{
byte* p = (byte*)(void*)Scan0;
for (int y = 0; y < Height; y++)
{
for (int x = 0; x < Width; x++)
{
if (rgbData[x, y, 0] > mean)
{
rgbData[x, y, 0] = 255;
rgbData[x, y, 1] = 255;
rgbData[x, y, 2] = 255;
p[0] = (byte)rgbData[x, y, 2]; // 先放 B
++p;
p[0] = (byte)rgbData[x, y, 1]; // 再放 G
++p;
p[0] = (byte)rgbData[x, y, 0]; // 最後放 R
++p;
}
else
{
rgbData[x, y, 0] = 0;
rgbData[x, y, 1] = 0;
rgbData[x, y, 2] = 0;
p[0] = (byte)rgbData[x, y, 2]; // 先放 B
++p;
p[0] = (byte)rgbData[x, y, 1]; // 再放 G
++p;
p[0] = (byte)rgbData[x, y, 0]; // 最後放 R
++p;
}
}
p += ByteOfSkip; // 跳過剩下的 Padding bytes
}
}
bimage.UnlockBits(bmData);
Bitmap binew = pictureBox1.Image as Bitmap;
pictureBox1.Image = binew;
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.17.136.141
推 leo60037:if (rgbData[x, y, 0] > mean) 改成 if (p[2] > mean) 11/28 21:57
→ leo60037:你是要做 Threshold 吧 只考慮 R 這樣效果好嗎? 11/28 22:01