c++ - 如何将 gdi+ 类位图结构转换为 HDC?

标签 c++ gdi+ bitmap gdi

如何将类位图结构转换为 HDC?

我现在正在用 c++,gdi 编写图像处理程序。

如果我有 HDC。 我可以通过以下代码在 gdi 中的 HDC 上绘制任何我喜欢的东西。

// HDC is handy.
HDC dc;
dc.DrawXXX       // I can draw using gdi method.
Graphics gr(dc); // now I can also draw on the dc using gdi+ method.

我的应用程序基于 FreeImage。 我制作了 fipImage。 (使用像位图这样的数据结构)

但是如果我想在fipWinImage上绘制,现在我必须将fipWinImage复制到Bitmap,然后在Bitmap上绘制,最后再将位图转换成fipImage,这很耗时又耗内存。

Convert fipImage to Bitmap -> Draw on the bitmap -> convert bitmap to fipWinImage

fipWinImage imagefip;
Bitmap* tempImg = new Bitmap(imagefip->GetWidth(), imagefip.GetHeigt(), PixelFormat24bppRGB); // memory comsuming is image is large
Graphics *pGr = Graphics::FromImage(tempImg);

HDC dc = pGr->GetHDC();

RECT rec;
rec.left = 0;
rec.top = 0;
rec.right = imagefip.GetWidth();
rec.bottom = imagefip.GetHeight();
fipImage.draw(dc, rec); // using stretchdibits()
pGr->ReleaseHDC(dc);

Graphics gr(tempImg);
HDC dc = gr.GetHDC();         // Get an Hdc, draw using gdi method
gr.ReleaseHDC(tempDC);     //
gr.drawXXX                            // Draw using gdi+ method.


fipWinImage fipImg;             // final result fipWinImage.
HBITMAP temp;
Color color;
tempImg->GetHBITMAP(color, &temp);
fipImg->copyFromBitmap(temp);

我想直接从 fipImage 构建一个 HDC。并直接在 fipWinImage 上绘制 我该怎么做?

最佳答案

首先澄清几点:

设备上下文基本上是一种结构,可以记住前景和背景颜色、画笔、字体信息和物理绘图表面(位图)等内容。

这是一件很方便的事情,因此当您一个接一个地执行图形操作时,您不必一直指定所有这些东西。您还可以通过这种方式更轻松地传递所有这些设置。这就是 DC 的真正含义 - 只是绘图参数的集合,包括要绘制的表面。

“HDC”只是这些结构之一的句柄(引用)。作为“句柄”,窗口可以在内存中四处移动结构以管理可用空间,而不会弄乱指向它的指针。

如果您可以访问您正在使用的库的源代码,请检查 fipWinImage::draw(...) 方法。如果他们正在使用 StretchDIBits,那么他们必须在某个时候将他们的原始位图数据转换为兼容的格式。也有可能 fipWinImage 类正在包装底层 BITMAP 或 DIB 等。

获得自己的 HDC 的最后一步......

位图被“选择”到设备上下文中,并且一次只能被选择到一个 DC 中。如果您可以从 fipWinImage 获取内部 HBITMAP,则可以将其选入另一个 DC(假设它仍未选入另一个 HC)。

当您创建一个 DC 时,Windows 会自动为其创建一个 1x1 位图(因为 DC 必须始终具有选定的位图)。当您在新位图中进行选择时,您将获得返回给您的先前选择的位图的句柄。坚持下去,因为完成后您需要将其放回原处。

希望对您有所帮助。

关于c++ - 如何将 gdi+ 类位图结构转换为 HDC?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1169479/

相关文章:

c++ - 如何混合 OpenCV 1.0 和 OpenCV 2.0

vb.net - 填充路径没有填充整个图形路径?

c++ - 将 char * 作为参数传递

c++ - Windows 上 C++ 中的位图操作

java - 自定义布局绘制 Canvas 失败

c# - 性能 - 连接 C-sharp 和 C++ 对性能有何影响?

c++ - 程序退出,状态为 255 C++ Main with Ada

c++ - 如何在标准 GUI 应用程序中以 Qt3D 呈现?

c++ - gdiplus 从字符串构造图像

java - 在 Android 中呈现的图像上的锯齿状边缘