如何将 GDI 图像* 转换为位图*
我正在用 c++、gdi+ 编写代码。
我利用 Image 的 GetThumbnail() 方法来获取缩略图。 但是,我需要将其转换为 HBITMAP。 我知道下面的代码可以获取GetHBITMAP:
Bitmap* img;
HBITMAP temp;
Color color;
img->GetHBITMAP(color, &temp); // if img is Bitmap* this works well。
但是如何快速将Image*转换为Bitmap*呢? 非常感谢!
实际上,现在我必须使用以下方法:
int width = sourceImg->GetWidth(); // sourceImg is Image*
int height = sourceImg->GetHeight();
Bitmap* result = new Bitmap(width, height,PixelFormat32bppRGB);
Graphics gr(result);
//gr.SetInterpolationMode(InterpolationModeHighQuality);
gr.DrawImage(sourceImg, 0, 0, width, height);
我真的不知道为什么他们不提供 Image* - > 位图*方法。 但让 GetThumbnail() API 返回一个 Image 对象......
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
编辑:
我正在查看 GDI+ 的 .NET 参考,但以下是 .NET 实现该构造函数的方式。
所有这些功能都可以在 GDI+ 的 C++ 版本中使用
Edit:
I was looking at the.NET reference of GDI+, but here is how .NET implements that constructor.
All those function are avaliable in the C++ version of GDI+
首先,您可以尝试
dynamic_cast
,因为在许多情况下(如果不是大多数 - 至少在我的用例中),Image
是由Bitmap
实现的。 因此,如果不知何故它不是(
bitmap
将是nullptr
),那么您可以尝试更通用的解决方案。例如,使用
Save
方法将Image
保存到 COMIStream
,然后使用Bitmap::FromStream
从该流创建Bitmap
。可以使用 COM
IStream
“nofollow noreferrer”>CreateStreamOnHGlobal
WinAPI 函数。 然而,这效率不高,尤其是对于较大的流,但要测试它的想法。还有其他类似的解决方案可以通过阅读
Image
和
位图
文档。遗憾的是,我还没有亲自尝试过(使用
Image
,它不是Bitmap
),所以我不完全确定。First you may try
dynamic_cast
as in many cases (if not most - at least in my use cases)Image
is being implemented byBitmap
. SoHowever if somehow it is not (
bitmap
will benullptr
) then you could try a more general solution.For example save the
Image
to a COMIStream
usingSave
method and then useBitmap::FromStream
to createBitmap
from that stream.A simple COM
IStream
could be created using theCreateStreamOnHGlobal
WinAPI function. However this is not efficient, especially for larger streams, but to test the idea it will do.There are also other similar solutions which can be deduced from reading
Image
andBitmap
documentation.Sadly I haven't tried it on my own (with
Image
which is not aBitmap
) so I am not entirely sure.据我所知,您只需创建一个位图并将图像绘制到其中:
As far as I can tell you have to just create a bitmap and paint the image into it: