user25749
user25749

Reputation: 4885

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....

Upvotes: 7

Views: 19721

Answers (3)

jwezorek
jwezorek

Reputation: 9525

As far as I can tell you have to just create a bitmap and paint the image into it:

Bitmap* GdiplusImageToBitmap(Image* img, Color bkgd = Color::Transparent)
{
    Bitmap* bmp = nullptr;
    try {
        int wd = img->GetWidth();
        int hgt = img->GetHeight();
        auto format = img->GetPixelFormat();
        bmp = new Bitmap(wd, hgt, format);
        auto g = std::unique_ptr<Graphics>(Graphics::FromImage(bmp));
        g->Clear(bkgd);
        g->DrawImage(img, 0, 0, wd, hgt);
    } catch(...) {
        // this might happen if img->GetPixelFormat() is something exotic
        // ... not sure
    }
    return bmp;
}

Upvotes: 3

Adam Badura
Adam Badura

Reputation: 5339

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.

Upvotes: 3

Shay Erlichmen
Shay Erlichmen

Reputation: 31928

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+

Upvotes: 3

Related Questions