我是在C#中使用封装的C库,需要将从该库传来的图像转换为位图并重新转换回去,但不需要复制像素缓冲区。
转换为位图很简单:
Bitmap WrapAsBitmap(CImage image)
{
return new Bitmap(image.Width, image.Height, image.BytesPerLine, PixelFormat.Format24bppRgb, image.Data);
}
只需将原始像素缓冲区 (image.Data
) 传递给 Bitmap
构造函数,无需复制。要执行相反操作,我需要调用 LockBits
和 UnlockBits
来访问原始像素缓冲区的 IntPtr
:
CImage WrapAsCImage(Bitmap bitmap)
{
BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat);
var image = new CImage(bitmap.Width, bitmap.Height, data.Stride * 3, data.Scan0);
bitmap.UnlockBits(data);
return image;
}
现在,正如您所看到的,如果在托管内存中,这实际上是一种危险的方法,因为位在新构建的图像将被使用之前被“解锁”。如果是从方法构建的,则没有问题,因为指向不会被.NET移动的非托管内存。因此,我想建立一个安全检查,检查指针的位置(托管/非托管)。
我考虑的另一种解决方案是继承类并跟踪原始指针以及,但是类是密封的,所以我没办法。
简而言之:有什么想法可以检测的位置(托管/非托管)吗?
CImage
是什么? - Alex FWrapAsBitmap
方法中显示。 - huysentruitw