2009-07-22 15 views
3

Ich schreibe Code in C++, Gdi +.Konvertieren von GDI + 's Bild * in Bitmap *

Ich verwende die Methode GetThumbnail() von Image, um ein Thumbnail zu erhalten. Allerdings muss ich es in HBITMAP konvertieren. Ich weiß, der folgende Code kann GetHBITMAP erhalten:

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

Aber wie kann ich Bild umwandeln * in Bitmap * schnell? Vielen Dank!

Eigentlich jetzt habe ich die folgende Methode verwenden:

int width = sourceImg->GetWidth(); // sourceImg is Image* 
int height = sourceImg->GetHeight(); 
Bitmap* Result; 
result = new Bitmap(width, height,PixelFormat32bppRGB); 
Graphics gr(result); 
//gr.SetInterpolationMode(InterpolationModeHighQuality); 
gr.DrawImage(&sourceImg,0,0,width,height); 

Ich weiß wirklich nicht, warum sie keine Bild * -> Bitmap * Methode. aber wir GetThumbnail() API ein Image-Objekt zurückgeben ....

+4

Die Art und Weise Sie dies tun, ist in Ordnung. Der Grund, warum es im Allgemeinen nicht "schnell" konvertiert werden kann, ist, weil 'Image' nicht unbedingt eine Bitmap ist - es kann ein Vektorbild sein (obwohl das einzige Vektorformat, das mir bekannt ist, von GDI + unterstützt wird, ist WMF/EMF). Ich würde mir vorstellen, dass 'GetThumbnail' in diesem Fall auch ein Vektorbild erzeugen würde. –

+0

Vielen Dank! Ihr Kommentar klingt vernünftig! – user25749

Antwort

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

Edit: Ich wurde bei the.NET Bezug von GDI + suchen, aber hier ist, wie .NET, dass Konstruktor implementiert.

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

All jene Funktion ist verfügbar in der C++ Version von GDI +

+1

Ich sehe keine Konstruktoren für 'Bitmap', die ein' Image * 'akzeptieren. –

+1

ich auch ~~, Vielleicht in.NET es funktioniert, aber C++ bieten nicht diesen Konstruktor – user25749

2

Zuerst dynamic_cast wie in vielen Fällen versuchen kann (wenn nicht die meisten - zumindest in meinem Anwendungsfall) Image in der Tat ein Bitmap ist. 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. 

jedoch irgendwie, wenn dies nicht der Fall (bitmap wird NULL sein), dann könnten Sie eine allgemeinere Lösung versuchen.

Zum Beispiel speichern Sie die Image zu einem COMIStreamSave Methode und dann Bitmap::FromStream verwendet Bitmap aus diesem Strom zu erzeugen.

Eine einfache COMIStream erstellt werden, um die CreateStreamOnHGlobalWinAPI Funktion. Dies ist jedoch nicht effizient, insbesondere für größere Streams, sondern um die Idee zu testen, die es tun wird.

Es gibt auch andere ähnliche Lösungen, die aus dem Lesen Image und Bitmap Dokumentation abgeleitet werden können.

Leider habe ich es nicht selbst versucht (mit Image das ist kein Bitmap), also bin ich mir nicht ganz sicher.

+0

Es scheint, dass getThumbnail-Methode gibt ein Image * Object ... – user25749

+1

Eigentlich ist der Code in der Frage eine vollkommen gute Möglichkeit, eine Bitmap aus einem generischen Bild zu bekommen. –

+1

Meine Antwort gibt eine potentiell optimale Lösung, da die Kosten von dynamic_cast klein sind (verglichen mit dem Zeichnen/Kopieren des Bildes) und in den meisten Fällen denke ich, dass es erfolgreich sein wird. Wenn nicht, dann ist entweder meine Version oder der fragliche Code (nach meiner Antwort hinzugefügt) eine Möglichkeit zu tun. Der Code aus Frage scheint einfacher und sicherer du. Ich bin mir jedoch nicht sicher, wie die Transparenz gehandhabt wird. Auch wenn es möglich ist, könnte es nützlich sein, getThumbnail zu reformieren, um Bitmap * zurückzugeben, da es nicht wahrscheinlich ist, dass es zum Beispiel eine Vektorgrafik erzeugt. –

1

Soweit ich sagen kann, man muss nur ein Bitmap erstellen und malen das Bild hinein:

Bitmap* GdiplusImageToBitmap(Image* img, Color bkgd = Color::Transparent) 
{ 
    Bitmap* bmp = nullptr; 
    try { 
     int wd = img->GetWidth(); 
     int hgt = img->GetHeight(); 
     auto format = img->GetPixelFormat(); 
     Bitmap* 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; 
} 
Verwandte Themen