Winapi 是否可以直接从GDI+位图执行BitBlt?

Winapi 是否可以直接从GDI+位图执行BitBlt?,winapi,gdi+,gdi,bitblt,Winapi,Gdi+,Gdi,Bitblt,是否可以使用BitBlt直接从GDI+位图中复制,而不使用GetHBitmap GetHBitmap速度较慢,因为它在BitBlt副本之外生成整个图像的新副本,并且比BitBlt副本慢,并且必须释放给定的HBITMAP。图像很大 是否有方法指向BitBlt以使用原始GDI+图像的像素数据 编辑:我可以得到一个指针,指向GDI+位图像素数据在内存中的位置。我可以创建一个指向GDI+位图像素数据的HBITMAP来避免额外的拷贝吗?然后再创建一个BitBlt?在搜索了几天之后,我突然意识到答案一直在我

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

GetHBitmap速度较慢,因为它在BitBlt副本之外生成整个图像的新副本,并且比BitBlt副本慢,并且必须释放给定的HBITMAP。图像很大

是否有方法指向BitBlt以使用原始GDI+图像的像素数据


编辑:我可以得到一个指针,指向GDI+位图像素数据在内存中的位置。我可以创建一个指向GDI+位图像素数据的HBITMAP来避免额外的拷贝吗?然后再创建一个BitBlt?

在搜索了几天之后,我突然意识到答案一直在我面前!我正在从指向字节数组的指针创建一个GDI+位图。然后尝试使用同一指针创建HBITMAP。但是我可以很容易地首先创建HBITMAP,然后使用它的指针来创建GDI+位图

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

代码如下:

// 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);

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