0

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

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

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

任何人都可以帮助我吗?

4

3 回答 3

2

你可以做这样的事情,其中​​图像是你的位图:

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;

我知道您不想将位图的 RGB 值复制到另一个数组,但这是最好的解决方案。该数组仅在使用 C 代码绘制时才会在内存中。我在 Windows Professional 6 中使用了类似的方法,它并没有引入很多开销。有许多 FastBitmap 实现可用。您可以在stackoverflow或此实现上检查此问题

于 2012-10-21T17:02:38.847 回答
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;
于 2012-10-21T16:56:12.890 回答
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

再次感谢

于 2012-11-28T12:31:22.110 回答