在C#中将位图转换为布尔数组的快速方法?
我正在制作一个XNA应用程序,其中我每秒从网络摄像头捕获4次屏幕截图,然后当像素颜色红色低于某个阈值时,我尝试将其转换为布尔数组。当我将其转换为纹理2D时,它不会延迟,但当我尝试获取单个像素时,它会延迟,即使网络摄像头分辨率为176x144 以下是获取位图的代码:在C#中将位图转换为布尔数组的快速方法?,c#,arrays,performance,bitmap,boolean,C#,Arrays,Performance,Bitmap,Boolean,我正在制作一个XNA应用程序,其中我每秒从网络摄像头捕获4次屏幕截图,然后当像素颜色红色低于某个阈值时,我尝试将其转换为布尔数组。当我将其转换为纹理2D时,它不会延迟,但当我尝试获取单个像素时,它会延迟,即使网络摄像头分辨率为176x144 以下是获取位图的代码: public Bitmap getBitmap() { if (!panelVideoPreview.IsDisposed) { Bitmap b = new Bitma
public Bitmap getBitmap()
{
if (!panelVideoPreview.IsDisposed)
{
Bitmap b = new Bitmap(panelVideoPreview.Width, panelVideoPreview.Height, PixelFormat.Format32bppRgb);
using (Graphics g = Graphics.FromImage(b))
{
Rectangle rectanglePanelVideoPreview = panelVideoPreview.Bounds;
Point sourcePoints = panelVideoPreview.PointToScreen(new Point(panelVideoPreview.ClientRectangle.X, panelVideoPreview.ClientRectangle.Y));
g.CopyFromScreen(sourcePoints, Point.Empty, rectanglePanelVideoPreview.Size);
}
return b;
}
else
{
Bitmap b = new Bitmap(panelVideoPreview.Width, panelVideoPreview.Height);
return b;
}
}
这是将位图转换为布尔数组的代码:
public bool[,] getBoolBitmap(uint treshold)
{
Bitmap b = getBitmap();
bool[,] ar = new bool[b.Width, b.Height];
for (int y = 0; y < b.Height; y++)
{
for (int x = 0; x < b.Width; x++)
{
if (b.GetPixel(x, y).R < treshold)
{
ar[x, y] = false;
}
else
{
ar[x, y] = true;
}
}
}
return ar;
}
public bool[,]getBoolBitmap(uint-treshold)
{
位图b=getBitmap();
bool[,]ar=新bool[b.宽度,b.高度];
对于(int y=0;y
Hans Passant提供的答案是正确的,最好使用锁位并同时处理数据
您还可以尝试编写一个着色器来设置数据阈值,从而利用GPU的强大功能来并行处理输入图像流,速度要快得多。GetPixel()非常慢,它必须锁定每个像素的位图数据。请改用Bitmap.LockBits()。当你把它放进搜索框时,会有很多点击率。