Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Convert GDI+'s Image* into Bitmap*

I am writting code in c++, gdi+.

I make use of Image's GetThumbnail() method to get thumbnail. However, I need to convert it into HBITMAP. I know the following code can get GetHBITMAP:

Bitmap* img;
HBITMAP temp;
Color color;
img->GetHBITMAP(color, &temp); // if img is Bitmap*  this works well。

But how can I convert Image* into Bitmap* fast? Many thanks!

Actually, now I have to use the following method:

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

I really don't know why they do not provide Image* - > Bitmap* method. but let GetThumbnail() API return a Image object....

like image 787
user25749 Avatar asked Jul 22 '09 06:07

user25749


2 Answers

Image* img = ???;
Bitmap* bitmap = new Bitmap(img);

Edit: I was looking at the.NET reference of GDI+, but here is how .NET implements that constructor.

using (Graphics graphics = null)
{
    graphics = Graphics.FromImage(bitmap);
    graphics.Clear(Color.Transparent);
    graphics.DrawImage(img, 0, 0, width, height);
}

All those function are avaliable in the C++ version of GDI+

like image 65
Shay Erlichmen Avatar answered Oct 25 '22 02:10

Shay Erlichmen


First you may try dynamic_cast as in many cases (if not most - at least in my use cases) Image is being implemented by Bitmap . So

Image* img = getThumbnail( /* ... */ );
Bitmap* bitmap = dynamic_cast<Bitmap*>(img);
if(!bitmap)
    // getThumbnail returned an Image which is not a Bitmap. Convert.
else
    // getThumbnail returned a Bitmap so just deal with it.

However if somehow it is not (bitmap will be nullptr) then you could try a more general solution.

For example save the Image to a COM IStream using Save method and then use Bitmap::FromStream to create Bitmap from that stream.

A simple COM IStream could be created using the CreateStreamOnHGlobal 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 and Bitmap documentation.

Sadly I haven't tried it on my own (with Image which is not a Bitmap) so I am not entirely sure.

like image 20
Adam Badura Avatar answered Oct 25 '22 01:10

Adam Badura