begin process at 2010 02 10 01:07:09
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Graphique

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

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


 Information sur la source

Note :
Aucune note
Catégorie :Graphique Niveau :Débutant Date de création :11/09/2004 Date de mise à jour :11/09/2004 16:30:34 Vu :7 469

Auteur : SnOOpss

Ecrire un message privé
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 :

 Sources du même auteur

Source avec Zip AUTOMATION DE EXCEL ENTIEREMENT EN WIN32 ET SOUS FORME DE CL...
Source avec Zip Source avec une capture CUSTOMISATION DE CONTROLES AUTOMATIQUE OU APPLICATION DE THE...
Source avec Zip Source avec une capture JEU DIRECTX EN MODE FENETRE + RESEAU

 Sources de la même categorie

Source avec Zip Source avec une capture VIEWER COMPLET POUR LE TRAITEMENT DE L'IMAGE : IMANALYSE par Pistol_Pete
Source avec Zip DECOUPAGE DE SPRITES par Jackyzgood
Source avec Zip Source avec une capture SIMULATION DE LA DIFFUSION THERMIQUE par ncoder
Source avec Zip Source avec une capture Source .NET (Dotnet) TRANSFORMÉ DE FOURIER RAPIDE EN TRAITEMENT D'IMAGE par reyken
Source avec Zip Source avec une capture 2D GAME DIRECT X 9 par nanonavich

Commentaires et avis

Commentaire de Pamaury le 12/09/2004 07:51:44

j'avoue que je ne connaissait absolument pas .

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.

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.

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.

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)

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

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.

Commentaire de sjasmin le 24/10/2005 21:29:47

trop génial ce code :)

Commentaire de Ombitious_Developper le 15/12/2005 17:46:40

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

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.

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

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.

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.

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

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

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

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

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

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,671 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales