Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何转换gdi+;将类似位图的结构转换为HDC?_C++_Gdi+_Bitmap_Gdi - Fatal编程技术网

C++ 如何转换gdi+;将类似位图的结构转换为HDC?

C++ 如何转换gdi+;将类似位图的结构转换为HDC?,c++,gdi+,bitmap,gdi,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。 我喜欢看电影。

如何将类似位图的结构转换为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。 我喜欢看电影。(使用类似位图的数据结构)

然而,如果我想在FipMinimage上绘制,现在我必须将FipMinimage复制到位图上,然后在位图上绘制,最后再将位图转换为fipImage,这既耗时又占用内存

将图像转换为位图->在位图上绘制->将位图转换为图像

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上绘制
我怎样才能做到这一点呢?

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

首先需要澄清:

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

这是一件很方便的事情,因此当您在一个接一个地执行图形操作时,不必一直指定所有这些内容。您还可以通过这种方式更轻松地传递所有这些设置。这就是DC的全部——只是一组绘图参数,包括要绘制的曲面

“HDC”只是这些结构之一的句柄(引用)。作为一个“句柄”,Windows可以在内存中移动结构来管理可用空间,而不会使指向它的指针出错

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

获取自己的HDC的最后一步

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

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

希望有帮助