【问题标题】:Is it possible to BitBlt directly from a GDI+ bitmap?是否可以直接从 GDI+ 位图 BitBlt?
【发布时间】:2011-06-03 01:18:01
【问题描述】:

是否可以使用 BitBlt 直接从 GDI+ 位图中复制而不使用 GetHBitmap?

GetHBitmap 很慢,因为它会创建整个图像的新副本,除了 BitBlt 副本之外并且比它慢,并且必须释放给定的 HBITMAP。图片很大。

有没有办法让BitBlt使用原始GDI+图像的像素数据?

编辑:我可以获得指向 GDI+ 位图像素数据在内存中的位置的指针。我可以创建一个指向 GDI+ 位图像素数据的 HBITMAP 以避免额外的副本,以及由此产生的 BitBlt 吗?

【问题讨论】:

  • BitBlt 从一个 DC 复制到另一个。要将位图绘制到 DC 上,请将位图选择到源 DC,然后将其 BitBlt 到目标。如果这就是您想要对 GDI+ Bitmap 对象执行的操作,您不应该只使用 Graphics.DrawImage,其中 Graphics 对象包装了预期的目标 DC 吗?为什么要通过HBitmap
  • 我需要 BitBlt 的原因是它的光栅操作。 DrawImage 无法从一个图像到另一个图像执行 OR 操作。我已经用 GDI 位图完成了,但是如何将 GDI+ 位图选择到 HDC 中呢?我真的很想知道这是否可能。
  • 呃,s/it's/its

标签: winapi gdi+ gdi bitblt


【解决方案1】:

找了几天,突然发现答案一直盯着我看!我正在从指向字节数组的指针创建 GDI+ 位图。然后尝试使用相同的指针创建 HBITMAP。但我可以先轻松创建 HBITMAP,然后使用其中的指针创建 GDI+ 位图。

它就像一个魅力!您可以随意混合 GDI 和 GDI+ 操作。该图像同时是普通的 GDI 和 GDI+。您可以从完全相同的像素数据中 BitBlt,而不是使用 DrawImage!

代码如下:

// Create the HBITMAP
BITMAPINFO binfo = new BITMAPINFO();
binfo.biSize = (uint)Marshal.SizeOf(typeof(BITMAPINFO));
binfo.biWidth = width;
binfo.biHeight = height;
binfo.biBitCount = (ushort)Image.GetPixelFormatSize(pixelFormat);
binfo.biPlanes = 1;
binfo.biCompression = 0;

hDC = CreateCompatibleDC(IntPtr.Zero);

IntPtr pointer;
hBitmap = CreateDIBSection(hDC, ref binfo, 0, out pointer, IntPtr.Zero, 0);

// Create the GDI+ bitmap using the pointer returned from CreateDIBSection
gdiBitmap = new Bitmap(width, height, width * binfo.biBitCount >> 3, pixelFormat, pointer);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2012-03-09
    • 2018-04-28
    • 2011-08-09
    相关资源
    最近更新 更多