C#에서 랩핑 된 C 라이브러리를 사용 중이므로 해당 라이브러리의 이미지를 비트 맵으로 변환 한 후 다시 변환해야하지만, 픽셀 버퍼를 복사하지 않고 이 아닙니다. 비트 맵으로 변환IntPtr이 관리되는 메모리 또는 관리되지 않는 메모리를 가리키는 지 확인합니다.
는 간단했다
Bitmap WrapAsBitmap(CImage image)
{
return new Bitmap(image.Width, image.Height, image.BytesPerLine, PixelFormat.Format24bppRgb, image.Data);
}
단지 Bitmap
생성자 원래 픽셀 버퍼 (image.Data
)에 전달하여이 카피가 필요하지 않다. 반대를하고, 나는 원래 픽셀 버퍼의 IntPtr
에 액세스하려면 LockBits
및 UnlockBits
를 호출해야 : 당신이 볼 수있는 data.Scan0
관리 메모리에있는 경우,
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;
}
이제,이 실제로 위험하다 새롭게 구성된 image
이 사용되기 전에 비트가 '잠금 해제 됨'으로 접근합니다. WrapAsBitmap
메서드에서 bitmap
을 만든 경우 data.Scan0
은 관리되지 않는 메모리를 가리키며 .NET에서 이동하지 않으므로 아무런 문제가 없습니다. 따라서 data.Scan0
포인터의 위치 (관리/비 관리)를 확인하는 안전성 검사를 구축하고 싶습니다.
내가 생각 된 다른 솔루션은 Bitmap
클래스에서 상속과 Bitmap
와 함께 원래의 포인터 image.Data
를 추적 할 수 있었다, 그러나 Bitmap
클래스는 밀봉, 그래서 나는 운입니다.
요약 :IntPtr
의 위치 (관리되는/관리되지 않는)를 감지하는 방법은 무엇입니까?
여기에 'CImage'란 무엇입니까? –
C 라이브러리에서 오는 이미지를 래핑하는 래퍼 클래스입니다. 이 클래스의 유일한 관련 멤버는'WrapAsBitmap' 메서드에 표시됩니다. –
그것은 가능할 것입니다 (잘 모르겠습니다). 여기에 또 다른 문제가 있습니다. CImage -> WrapAsBitmap -> WrapAsCImage -> CImage, 이제 두 개 있습니다. 동일한 메모리를 가리키는 CImage 인스턴스. 어쩌면 당신은 WrapAsCImage에서 메모리를 복사해야합니까? –