如何将类似gdi + Bitmap的结构转换为HDC?

时间:2009-07-23 03:40:25

标签: c++ gdi+ bitmap gdi hdc

如何将类似Bitmap的结构转换为HDC?

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

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

// 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。 (使用像Bitmap这样的数据结构)

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

将fipImage转换为位图 - >在位图上绘制 - >将位图转换为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上绘制 我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

首先澄清几点:

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

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

“HDC”只是这些结构之一的句柄(引用)。作为一个“句柄”,让窗口在内存中移动结构来管理自由空间,而不会让你的指针搞砸。

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

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

位图被“选择”到设备上下文中,并且一次只能被选择为单个DC。如果你可以从fipWinImage获取内部HBITMAP,你可以将它选择到另一个DC(假设它还没有被选择到另一个HC)。

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

希望有所帮助。

答案 1 :(得分:0)

我不知道FreeImage,但是如果你能得到一个指向实际像素数据(DIB部分)的指针,你可以创建一个共享它的HBITMAP,而不必每次都复制数据。