访问位图的字节数组

时间:2012-10-21 16:43:26

标签: c# c++ c bitmap

1-在Windows CE中,我在C#中有一个Bitmap对象。

2-我在extern dll中有一个C函数,它希望作为参数指向一个字节数组的指针,该数组表示RGB565格式,宽度和高度的图像。此函数将绘制此字节数组。

所以我需要传递Bitmap对象的字节数组指针,但我可以找到一种实用的方法来获取这个指针。一种方法是使用内存流或其他东西将此Bitmap转换为字节数组,但它会创建一个新的字节数组,因此我会在内存中保留对象,Bitmap和bytes数组,但我不想要它因为可用内存很少,这就是为什么我需要访问位图对象的bytes数组,而不是创建一个新的字节数组。

任何人都可以帮助我?

3 个答案:

答案 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

再次感谢