【发布时间】:2017-07-05 07:44:48
【问题描述】:
据我所知,在垃圾收集器负责内存管理的托管环境中没有指针的概念。就像如果有人想要操作位图中的像素值,她/他必须首先像下面的代码那样锁定它。
Bitmap Image = new Bitmap(width, height,
System.Drawing.Imaging.PixelFormat.Format8bppIndexed);
Rectangle rect = new Rectangle(0, 0, width, height);
BitmapData bmpData = Image.LockBits(rect, ImageLockMode.ReadWrite,
PixelFormat.Format8bppIndexed);
IntPtr imageScan0 = bmpData.Scan0;
unsafe
{
byte* ptr = (byte*)imageScan0;
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
*ptr++ = 128;
}
}
}
Image.UnlockBits(bmpData);
我的主要问题是: 如果我存储 imageScan0 信息然后解锁位图,我仍然可以使用 imageScan0 来操纵它的值,就像我在锁定和解锁操作之间操纵它一样。
我已经对其进行了测试,我很惊讶地发现 imageScan0 仍然可以操作。 我的猜测是底层位图驻留在非托管内存上。
【问题讨论】:
-
当然可以在UnlockBits之后进行操作,但不能保证。它可能会也可能不会。