Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

OBTENIT UN HBITMAP A PARTIR D UN JPEG GIF BMP SANS LES MFC


Information sur la source

Catégorie :Graphique Niveau : Débutant Date de création : 11/09/2004 Date de mise à jour : 11/09/2004 16:30:34 Vu : 6 941

Note :
Aucune note

Commentaire sur cette source (18)
Ajouter un commentaire et/ou une note

Description

Ben ya tout dans le titre. Ca permet de charger un fichier image bmp,gif ou jpeg et d obtenir directement son HBITMAP !!!
Ce code n'est pas de moi mais je l'ai trouvé tellement simple et puissant que je trouve bizarre que des personnes demandent encore comment charger des *.gif ou des *.jpeg
Trouvé sur http://www.codeguru.com/Cpp/G-M/bitmap/article.php/c4935/ mais c celui ki se trouve dans les post qui marche le mieux !!!
 

Source

  • #include <olectl.h>
  • #include <ole2.h>
  • HBITMAP LoadAnImage(char* FileName)
  • {
  • WCHAR wpath[MAX_PATH];
  • MultiByteToWideChar(CP_ACP, 0, FileName, -1, wpath, MAX_PATH);
  • IPicture* pPic;
  • OleLoadPicturePath(wpath, NULL, NULL, NULL, IID_IPicture,(LPVOID*)&pPic);
  • HBITMAP hPic = NULL;
  • pPic->get_Handle((UINT*)&hPic);
  • HBITMAP hPicRet = (HBITMAP)CopyImage(hPic, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG);
  • pPic->Release();
  • return hPicRet;
  • }
#include <olectl.h>
#include <ole2.h>



HBITMAP LoadAnImage(char* FileName)
{
    WCHAR wpath[MAX_PATH];
    MultiByteToWideChar(CP_ACP, 0, FileName, -1, wpath, MAX_PATH);

    IPicture* pPic;
    OleLoadPicturePath(wpath, NULL, NULL, NULL, IID_IPicture,(LPVOID*)&pPic);

HBITMAP hPic = NULL;
    pPic->get_Handle((UINT*)&hPic);

    HBITMAP hPicRet = (HBITMAP)CopyImage(hPic, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG);

    pPic->Release();
    return hPicRet;
}

Historique

11 septembre 2004 16:30:34 :

Commentaires et avis

signaler à un administrateur
Commentaire de Pamaury le 12/09/2004 07:51:44

j'avoue que je ne connaissait absolument pas .

signaler à un administrateur
Commentaire de BruNews le 12/09/2004 14:14:49 administrateur CS

Precisions:
Mettre CoInitialize(0); dans WinMain.
Verifer les retours sinon crash:
if(OleLoadPicturePath(...)) return 0;
get_Handle() doit aussi retourner 0 pour valide.

signaler à un administrateur
Commentaire de Boing le 12/09/2004 20:04:05

Bien, sinon, GDI+ fait aussi plein de choses et permet de traiter les bmp, gif, png, tiff et jpeg en lecture et écriture.
Autre petite remarque, j'ai bien noter que le code vient de codeguru, mais pour convertir entre ANSI et UNICODE, je trouve plus simple d'utiliser sprintf avec %S (S majuscule) qui permet de convertir simplement en gardant les options de précisions et autres.

signaler à un administrateur
Commentaire de BruNews le 12/09/2004 20:11:22 administrateur CS

Je pense que sprintf doit appeler MultiByteToWideChar a son tour, faudra que je pense a verifier.
Tant qu'on peut on evite d'inclure stdio.h dans un prog windows, API fournit tout en mieux et bien plus rapide.

signaler à un administrateur
Commentaire de Boing le 12/09/2004 21:05:26

la fonction output (générique printf) utilise wctomb et mbtowc pour effectuer la conversion ce qui revient au même de toute façon.
Par contre si tu utilises MFC (si si il en existe) tu peux utiliser %S avec CSting::Format.
Mais pour moi, c'est une question d'habitude et pas une religion ;o)

signaler à un administrateur
Commentaire de SnOOpss le 14/09/2004 20:42:14

Le verification des retours est indispensable, je l'ai verifié a mes depends lol !!!
Par contre CoInitialize je lit dans la doc que c obligatoire mais moi je ne m'en suis pas servis et ca marche sans problemes, est ce que c'est parce je m'en sert dans une dll ????

signaler à un administrateur
Commentaire de BruNews le 14/09/2004 21:00:24 administrateur CS

C'est que tu dois avoir quelque part dans ton processus un truc qui declenche le chargement de COM sinon n'irait pas.
Pour assurer vu que c'est dans dll, mets un CoInitialize au debut dans DllMain.

signaler à un administrateur
Commentaire de sjasmin le 24/10/2005 21:29:47

trop génial ce code :)

signaler à un administrateur
Commentaire de Ombitious_Developper le 15/12/2005 17:46:40

où je peux trouver <olectl.h> <ole2.h>

signaler à un administrateur
Commentaire de cedekasme le 15/03/2006 15:04:41

Salut à vous!

En ce qui me concerne j'ai un problème avec "OleLoadPicturePath(...)" car il ne me modifie pas la variable pPic qui par consequent reste toujours à NULL et qui entraine le plantage du programme sur :
"pPic->get_Handle((UINT*)&hPic);"

Est-ce que quelqu'un pourrait me dire d'où cela pourrait provenir ? Est-ce le fait de ne pas avoir mis CoInitialize(0) qui pourrait en etre la source ? car comme j'utilise la MFC, je ne sais pas à quel endroit je suis susceptible de le mettre. J'ai essayé à plusieurs endroits différents mais cela ne marche toujours pas...

Merci de votre aide.

signaler à un administrateur
Commentaire de BruNews le 15/03/2006 15:13:25 administrateur CS

C'est clair que sans chargement préalable de COM, pas d'accès aux interfaces.
Je ne me souviens plus où on met cela dans MFC, au besoin va voir un exemple ADO avec MFC sur codeguru et tu verras comment ils initialisent COM.
Ah quel plaisir les surcouches...

signaler à un administrateur
Commentaire de cedekasme le 15/03/2006 16:20:21

Merci BruNews :)

J'ai corrigé quelques problèmes puis j'ai ajouté le fameux "CoInitialize(NULL)" dans l'initialisation de ma classe (logique lol), et cela marche!

Par contre, comment je peux faire pour que mon image ait une taille prédéfinie? En fait je me suis amusé avec get_Height(...) et get_Width(...) de la classe IPicture mais cela ne change rien à la taille de mon image.

Merci encore pour ton aide.

signaler à un administrateur
Commentaire de BruNews le 15/03/2006 16:41:54 administrateur CS

L'image a la taille qu'elle a et basta, c'est à toi de calculer pour StretchDIBits() par exemple.

signaler à un administrateur
Commentaire de genetin le 03/02/2007 12:41:48

Ca fonctionne très bien, bravo.

Mais à quoi sert le CopyImage() ?
J'ai assayé d'afficher directement la bitmap hPic, et ça fonctionne très bien (en évitant une copie qui semble inutile).

signaler à un administrateur
Commentaire de rainiou le 22/06/2007 15:23:47

Salut!
voila j'ai un petit soucis... je suis pas un pro de c++ et encore moins de VC. Je suis sous VC7 (.net) et j'ai un soucis en utilisant ce script:

je suis alle voir la msdn qui conseil d'ailleurs d'utilisez CoInitializeEx pour les nouveaux programmes, il y a un parametre de plus : http://msdn2.microsoft.com/en-us/library/ms695279.aspx

Donc je test le CoInitializeEx (et non ex), cela me renvoit un code de reussite... de meme pour la conversion du path, mais lors de la conversion de l'image ca plante.

J'ai lu qu'il y avait des problemes avec OleLoadPicturePath si l'image de type JP(E)G, BMP, GIF ne sont pas bien "structures" allez savoir pourquoi... en ce qui me concerne j'ai donc teste sur plusieurs images crees avec PAINT (me disant que de MS a MS ca devrait aller) en differents formats, et j'ai toujours une erreur.

Quelqu'un aurait il eu le meme probleme en utilisant ce script? si oui quelle solution avez vous mis en place?

Est ce que le fait de desactiver cette librairie : "libcmt.lib" joue un role, ou egalement le fait que je soit en Single Threaded (je penche plus pour cette raison)?

signaler à un administrateur
Commentaire de rainiou le 24/06/2007 19:33:20

bon voila, apres quelques rechercher j'ai trouvé cette librairie :

http://members.cox.net/scottheiman/bmglib.htm

elle est tres bien ! elle recupere un HBITMAP a partir de differents types (et bien d'autrs fonctions sur les images) assez bien :

HBITMAP hBitmap = CreateBitmapFromJPEGFile( "mon_image.JPG" );

voila qui devrait participer a la resolution des prblemes de types ;)

signaler à un administrateur
Commentaire de gf18 le 05/09/2008 19:45:37

Dans le cas d'un .bmp , la simple fonction suivante suffit :

HBITMAP hvar = (HBITMAP) LoadImage(NULL,"C:\path\fichier.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);

signaler à un administrateur
Commentaire de Kian_ix le 17/12/2008 05:15:46

pile ce qu'il me failait merci ^^
plus besoin de se faire chier avec ce CreateCompatibleBitmap de mrd !!!!

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,530 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.