1-在Windows CE中,我在C#中有一个Bitmap对象。
2-我在extern dll中有一个C函数,它希望作为参数指向一个字节数组的指针,该数组表示RGB565格式,宽度和高度的图像。此函数将绘制此字节数组。
所以我需要传递Bitmap对象的字节数组指针,但我可以找到一种实用的方法来获取这个指针。一种方法是使用内存流或其他东西将此Bitmap转换为字节数组,但它会创建一个新的字节数组,因此我会在内存中保留对象,Bitmap和bytes数组,但我不想要它因为可用内存很少,这就是为什么我需要访问位图对象的bytes数组,而不是创建一个新的字节数组。
任何人都可以帮助我?
答案 0 :(得分:2)
您可以执行以下操作,其中image是您的Bitmap:
Rectangle area = (new Rectangle(0, 0, image.width, image.height));
BtimapData bitmapData = image.LockBits(area, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
stride = bitmapData.Stride;
IntPtr ptr = bitmapData.Scan0;
据我所知,您不希望将Bitmap的RGB值复制到另一个阵列,但这是最佳解决方案。只有在使用C代码绘制时,数组才会在内存中。我在Windows Professional 6中使用了类似的方法,并没有引入很多开销。有许多FastBitmap实现可用。您可以在stackoverflow或此implementation
上查看此问题答案 1 :(得分:1)
您可以使用不安全的代码来获取位图数据指针。
使用以下代码:
var rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
var bmpData =
bmp.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite,
bmp.PixelFormat);
IntPtr ptr = bmpData.Scan0;
byte* bmpBytes = (byte*)ptr.ToPointer();
其中bmp
是您的Bitmap
对象。
然后你也可以这样做:
ptr = new IntPtr(b);
bmpData.Scan0 = ptr;
答案 2 :(得分:0)
由于“NikolaD”和“oxilumin”的反应,我可以解决我的问题。
当我使用RGB565时,代码为:
imgMap.Image = new Bitmap(imgMap.Width, imgMap.Height, PixelFormat.Format16bppRgb565);
Rectangle area = (new Rectangle(0, 0, imgMap.Width, imgMap.Height));
BitmapData bitmapData = ((Bitmap)imgMap.Image).LockBits(area, ImageLockMode.ReadWrite, PixelFormat.Format16bppRgb565);
IntPtr ptrImg = bitmapData.Scan0;
其中: imgMap是一个PictureBox
再次感谢