Comment Convertir GDI+'Image de marque* en Bitmap*
Je suis de l'écriture du code en c++, gdi+.
- Je faire usage de l'Image GetThumbnail() la méthode pour obtenir des vignettes.
Cependant, j'ai besoin de le convertir en HBITMAP.
Je sais que le code suivant peut obtenir GetHBITMAP:
Bitmap* img;
HBITMAP temp;
Color color;
img->GetHBITMAP(color, &temp); //if img is Bitmap* this works well。
Mais comment puis-je convertir Image* en Bitmap* rapide?
Merci beaucoup!
En fait, maintenant, j'ai utiliser la méthode suivante:
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);
Je ne sais vraiment pas pourquoi ils ne fournissent pas d'Image* - > Bitmap* méthode. mais laissez-GetThumbnail() de l'API de renvoyer une Image de l'objet....
La façon dont vous faites c'est très bien. La raison pourquoi il ne peut pas être converti en "fast" est en général parce que
Image
n'est pas nécessairement une image bitmap à tous - il peut être un vecteur d'image (bien que le seul format vectoriel, je suis conscient de qui est pris en charge par GDI+ est WMF/EMF). J'imagine que dans ce cas, GetThumbnail
serait de produire un vecteur d'image.OriginalL'auteur user25749 | 2009-07-22
Vous devez vous connecter pour publier un commentaire.
Edit:
J'ai été à la recherche à the.NET référence de GDI+, mais ici est de savoir comment .NET met en œuvre ce constructeur.
Toutes ces fonctions sont disponibles dans la version C++ de GDI+
Bitmap
qui acceptent uneImage*
.moi aussi~~ , Peut-être .NET, il fonctionne, mais le c++ ne fournissent pas de ce constructeur
OriginalL'auteur Shay Erlichmen
D'abord, vous pouvez essayer
dynamic_cast
que dans de nombreux cas (si pas plus - au moins dans mon cas d'utilisation)Image
est en effet unBitmap
. DoncToutefois si d'une certaine façon, il n'est pas (
bitmap
seraNULL
), alors vous pouvez essayer un plus de solution générale.Par exemple enregistrer le
Image
à un COMIStream
à l'aide deSave
méthode, puis utiliserBitmap::FromStream
pour créerBitmap
flux.Un simple COM
IStream
pourrait être créé à l'aide de laCreateStreamOnHGlobal
WinAPI fonction. Cependant, ce n'est pas efficace, surtout pour les grands cours d'eau, mais pour tester l'idée.Il y a aussi d'autres solutions similaires qui peut être déduite à partir de la lecture de
Image
etBitmap
de la documentation.Malheureusement je n'ai pas essayé sur mon propre (avec
Image
qui n'est pas unBitmap
) donc je ne suis pas entièrement sûr.En fait, le code en question est une très bonne façon d'obtenir une image Bitmap d'une Image générique.
Ma réponse donne potentiellement solution optimale car les coûts de dynamic_cast est de petite taille (par rapport au dessin/copier l'image) et dans la plupart des cas, je pense qu'il va réussir. Si non, alors soit ma version ou le code en question (ajouté après ma réponse) est une façon de le faire. Le code de la question semble plus simple et plus sûr tu. Cependant, je ne suis pas sûr de la façon dont la transparence sera assurée par elle. Aussi, si possible, il pourrait être utile de revoir getThumbnail de retour Bitmap* comme il ne semble pas probable qu'il produit, par exemple un graphique vectoriel.
Je suis d'accord que pour une image Bitmap, GetThumbnail() la Méthode doit retourner une Image* qui pointe à l'objet Bitmap en fait. Mais Après tring-il , je l'ai trouvé points à l'Image de l'objet...
OriginalL'auteur Adam Badura
Aussi loin que je peux dire, vous avez juste à créer une image et la peinture de l'image:
OriginalL'auteur jwezorek