unsafe
{
byte* p = (byte*)(void*)Scan0;
//int nOffset = stride - m_Bitmap.Width * 3;
byte red, green, blue;
int nWidth = m_Bitmap.Width;
int nHeight = m_Bitmap.Height;
for (int y = 0; y < nHeight; ++y)
{
for (int x = 0; x < nWidth; ++x)
{
blue = p[0];
green = p[1];
red = p[2];
tt = p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);
rr[red]++;
gg[green]++;
bb[blue]++;
gray[tt]++; //统计灰度值为tt的象素点数目
p += 3; //每一个像素点由三个字节组成,分别代表red,green,blue.所以每次必须加3以移至下一像素点
}
//p += nOffset;
}
}byte* p = (byte*)(void*)Scan0;为何要用两个强制类型转换?
tt = p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);中数字前加点是什么意思?
{
byte* p = (byte*)(void*)Scan0;
//int nOffset = stride - m_Bitmap.Width * 3;
byte red, green, blue;
int nWidth = m_Bitmap.Width;
int nHeight = m_Bitmap.Height;
for (int y = 0; y < nHeight; ++y)
{
for (int x = 0; x < nWidth; ++x)
{
blue = p[0];
green = p[1];
red = p[2];
tt = p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);
rr[red]++;
gg[green]++;
bb[blue]++;
gray[tt]++; //统计灰度值为tt的象素点数目
p += 3; //每一个像素点由三个字节组成,分别代表red,green,blue.所以每次必须加3以移至下一像素点
}
//p += nOffset;
}
}byte* p = (byte*)(void*)Scan0;为何要用两个强制类型转换?
tt = p[0] = p[1] = p[2] = (byte)(.299 * red + .587 * green + .114 * blue);中数字前加点是什么意思?
这种写法很不优雅。Scan0不知道是什么
2次转换可能是这个原因,byte类型不能直接从非指针类型转换,必须先转换成一个指针。而void*则可以。所以要2次转换。