【发布时间】:2010-02-10 09:30:58
【问题描述】:
附录:当我取消选中“优化代码”时它似乎运行正确,这让我相信这是一些古怪的配置问题
首先,我尝试运行非托管代码。我检查了“允许不安全代码”。它指向这行代码,我试图在不使用相对较慢的 getpixel 的情况下读取位图:
byte[] buff = { scanline[xo], scanline[xo + 1], scanline[xo + 2], 0xff };
整个sn-p在下面。我该如何解决这个问题?
private const int PIXELSIZE = 4; // Number of bytes in a pixel
BitmapData mainImageData = mainImage.LockBits(new Rectangle(0, 0, mainImage.Width, mainImage.Height), ImageLockMode.ReadOnly, mainImage.PixelFormat);
List<Point> results = new List<Point>();
foundRects = new List<Rectangle>();
for (int y = 0; y < mainImageData.Height
{
byte* scanline = (byte*)mainImageData.Scan0 + (y * mainImageData.Stride);
for (int x = 0; x < mainImageData.Width; x++)
{
int xo = x * PIXELSIZE;
byte[] buff = { scanline[xo], scanline[xo + 1],
scanline[xo + 2], 0xff };
int val = BitConverter.ToInt32(buff, 0);
// Pixle value from subimage in desktop image
if (pixels.ContainsKey(val) && NotFound(x, y))
{
Point loc = (Point)pixels[val];
int sx = x - loc.X;
int sy = y - loc.Y;
// Subimage occurs in desktop image
if (ImageThere(mainImageData, subImage, sx, sy))
{
Point p = new Point(x - loc.X, y - loc.Y);
results.Add(p);
foundRects.Add(new Rectangle(x, y, subImage.Width,
subImage.Height));
}
}
}
【问题讨论】:
-
PIXELSIZE 的值是多少?
-
你确定图片是32bppRGB的形式吗?您没有在代码中的任何位置指定或检查像素格式。
-
另外,只需在循环之前将指针设置为 Scan0 一次,然后在内部循环内按 PIXELSIZE 递增它
-
mainImage.PixelFormat是什么?如果是Format24bppRGB,那就是你要过去的原因。 -
您不必先“固定”内存块吗?
标签: c#