1

这可能是以下未回答问题的重复:

 位图锁定帮助 - Format8bppIndexed

我以以下方式锁定图像:

// PixelFormat is 8BppIndexed in my case.
Bitmap bmp = new Bitmap("mySampleImage.tif");

// ClipRectangle will be a Rectangle such as {x=128, y=290, width=250, height=200},
// selected by the user by seeing the image on screen. Thus, it's a valid region
BitmapData data = bmp.LockBits(rect, ImageLockMode.ReadOnly, bmp.PixelFormat);

unsafe
{
  byte* origin = (byte*)data.Scan0.ToPointer();

  // Processing...
}

在处理部分,我在 Y 方向上逐步遍历 ClipRectangle 中的像素。然而,一个应该是有效的像素返回一个内存访问错误,说我不能取消引用指针。

例如,在 704x600 图像中使用:

ClipRectangle = {x=128, y=290, width=250, height=200}

像素(128x321)应该是有效的。通过手动输入数学以在中间窗口中获取该像素,我得到以下信息:

原点 + (321 * 步幅) + 128
0x053a80c0
    *(origin + (321 * stride) + 128): 不能取消引用'origin + (321 * stride) + 128'。指针无效。

步幅是 704,我的软件中的逻辑将确切的指针位置作为中间窗口,所以一切看起来都是正确的。可以很好地取消引用 290-320 的 Y 像素。如果我改为锁定整个位图,我的所有逻辑都可以正常进行,但我怀疑我是否得到了正确的像素,或者如何在 LockBits 中使用锁定矩形。

当我只锁定我需要的区域时,为什么我无法访问 BitmapData 中预期的锁定像素?

4

1 回答 1

3

当您使用具有偏移量的矩形锁定位时,BitmapData.Scan0不会返回位图原点,而是返回指定的矩形原点。

所以,如果你使用:

Rectangle rect = new Rectangle(128, 290, 250, 200);
BitmapData data = bmp.LockBits(rect, ImageLockMode.ReadOnly, bmp.PixelFormat);

那么最大偏移量Scan0(250 * Stride) + 200

换句话说,(128x321) 处的像素将位于(Scan0 + (321 - 290) * Stride).

于 2009-07-02T22:02:37.287 回答