IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Charger une image a partir d'un buffer


Sujet :

Langage C++

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut Charger une image a partir d'un buffer
    Bonjour,

    Existe -il un moyen pour charger une image contenu dans un buffer ?

    actuellement je sais récupérer une image via http et l'afficher dans une fenetre Windows,

    Je sais charger une image sur disque et l'afficher sur une fenêtre Window.

    Je sais stocker des images dans un buffer. (raw image).

    Je sais stocker des images dans un fichier cache puis récupérer une image du cache dans un buffer.

    Je ne sais pas afficher une image dans une fenêtre windows qui se trouve dans un buffer.

    J'utilise Visual Studio 2010, application win32 api c++.

    en gros il faudrait une fonction de ce type

    hBitmap = LoadImageFromMemory(char * buffer, size_t size), quelque chose comme ca

    quel serais le principe ? sans utiliser de dll, eventuellement une librairie statique qui existe ou directement en c++.

    peu importe le format d'images, au moins dans un premier temps un jpg par exemple histoire de m'orienter.

    J'ai fait des recherches sur google mais je n'ai pas trouvé l'information que je voulais.

    Merci de votre aide.

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,

    Il me semble que j'avais réussi à le faire il y a quelques années, mais c'était une galère sans nom avec une histoire de CreateDC, CreateDIBSection, BitBlit et consorts. Toute l'API GDI est une horreur de toute façon.

    Donc j'aurais tendance à dire que le plus simple reste de copier le buffer dans une fichier temporaire puis de charger ce fichier là via LoadImage

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    j'avais pense a ca, mais ce que tu viens de dire c'est possible mais c'est valable que pour les fichiers bmp ?

    car j'ai du croisé un code sur le net qui se ressemblait a ce que tu disais mais ca concernais un fichier bmp.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    Ce code fonctionne, renvoi un handle de bitmap pour n'importe quel image contenu dans un buffer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    #include <windows.h>
    #include <stdio.h>
     
    using namespace Gdiplus;
     
    #pragma comment(lib, "gdiplus.lib")
     
    HBITMAP LoadAnImageFromStream(const char * streamBuffer, size_t len)
    {	
    	IPicture* p;
    	IStream* s;
     
    	HGLOBAL hG;
    	void* pp;
     
    	hG = GlobalAlloc(GPTR,len);
    	if (!hG)
    	{		
    		return NULL;
    	}
     
    	pp = (void*)hG;
    	memcpy(pp, streamBuffer, len);
     
     
    	CreateStreamOnHGlobal(hG,false,&s);
    	if (!s)
    	{
    		GlobalFree(hG);
    		return NULL;
    	}
     
    	OleLoadPicture(s,0,false,IID_IPicture,(void**)&p);
     
    	if (!p)
    	{
    		s->Release();
    		GlobalFree(hG);
    		pp = 0;
    		return NULL;
    	}
     
    	s->Release();
    	GlobalFree(hG);
     
    	HBITMAP hB = 0;
    	p->get_Handle((unsigned int*)&hB);
     
     
    	HBITMAP hBB = (HBITMAP)CopyImage(hB, IMAGE_BITMAP, 0, 0, LR_COPYRETURNORG);
     
    	p->Release();
    	pp = 0;
    	return hBB;
    }
    Pour le fichier include mettre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #include <gdiplus.h>
    #include <olectl.h>
    #include <ole2.h>
     
    HBITMAP LoadAnImageFromStream(const char * streamBuffer, size_t len);

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 588
    Points
    41 588
    Par défaut
    Pour des données binaires brutes, autant utiliser void* (ou BYTE*/unsigned char*, mais ça apporte généralement plus d'ennuis que ça n'en résout)
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    HBITMAP LoadAnImageFromStream(const void * streamBuffer, size_t len);

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    360
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 360
    Points : 137
    Points
    137
    Par défaut
    Oui c'est une erreur de frappe, ce serais plutot unsigned char *

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/04/2009, 00h15
  2. Réponses: 7
    Dernier message: 22/01/2009, 10h39
  3. Charger une Image a partir d'une Url
    Par Bily.sdi dans le forum C++Builder
    Réponses: 4
    Dernier message: 22/05/2008, 02h14
  4. charger une image a partir du disque dur
    Par matnes dans le forum Images
    Réponses: 1
    Dernier message: 09/02/2008, 08h05
  5. Charger une image à partir d'une chaine HEXA
    Par Argonz dans le forum Delphi
    Réponses: 4
    Dernier message: 15/03/2007, 09h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo