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

Windows Discussion :

[WIC] Conversion d'images


Sujet :

Windows

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 35
    Points : 31
    Points
    31
    Par défaut [WIC] Conversion d'images
    Bonjour à tous,
    Dans le cadre d'un projet perso, je dois afficher une image sur une partie d'une fenêtre.
    J'ai bricoler une première version en utilisant GDI pour l'affichager et ne permettant de charger que des images bitmap. Je voudrais à présent pouvoir utiliser les types d'images les plus courants.
    J'ai pas mal potassé la MSDN sur le module WIC et lu leurs exemples, et j'ai bricolé une méthode me permettant de récupérer un HBITMAP à partir d'un nom de fichier (récupéré dans un fichier de conf', donc pas possible de jouer avec les ressources) :
    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
    HBITMAP Player::loadBitmap(wstring filepath) {
    	HBITMAP hBitmap;
    	HRESULT hr;
    
    	UINT width, height;
    
    	IWICImagingFactory *pFactory = NULL;
    	IWICBitmapDecoder *pDecoder = NULL;
    	IWICBitmapFrameDecode *pFrame = NULL;
    	IWICBitmapSource *pBitmap = NULL;
    
    	// Create an image factory that loads decoder
    	hr = CoCreateInstance(CLSID_WICImagingFactory,
    							NULL,
    							CLSCTX_INPROC_SERVER,
    							IID_IWICImagingFactory,
    							(LPVOID*)&pFactory);
    	hr = pFactory->CreateDecoderFromFilename(filepath.c_str(),
    												NULL,
    												GENERIC_READ,
    												WICDecodeMetadataCacheOnDemand,
    												&pDecoder);
    	// Retrieve the first frame
    	hr = pDecoder->GetFrame(0, &pFrame);
    	hr = pFrame->QueryInterface(IID_IWICBitmapSource, (void**)(&pBitmap));
    	hr = pBitmap->GetSize(&width, &height);
    
    	// Convert this frame for GDI processing
    	HDC hd = GetDC(NULL);
    	BYTE *pvImageBits = NULL;
    	BITMAPINFO bitmapInfo;
    	ZeroMemory(&bitmapInfo, sizeof(BITMAPINFO));
    		bitmapInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    		bitmapInfo.bmiHeader.biWidth = width;
    		bitmapInfo.bmiHeader.biHeight = -(LONG)height;
    		bitmapInfo.bmiHeader.biPlanes = 1;
    		bitmapInfo.bmiHeader.biBitCount = 32;
    		bitmapInfo.bmiHeader.biCompression = BI_RGB;
    
    	hBitmap = CreateDIBSection(hd, &bitmapInfo, DIB_RGB_COLORS, (void**)&pvImageBits, NULL, 0);
    
    	ReleaseDC(NULL, hd);
    	// Extract image into hbitmap
    	hr = pBitmap->CopyPixels(NULL, width*4,	(width*4)*height, pvImageBits);
    
    	return hr == S_OK ? hBitmap : NULL;
    }
    La géstion des erreurs n'est pas top, elle sera complètée plus tard.
    Après un passage sur le débugger, hr est toujours à S_OK. Donc le chargement devrait s'être passé correctement.

    Mais lorsque l'image est affiché, j'obtiens un effet étrange :

    L'original est en couleur. De plus, la largeur a été réduite (l'image d'origine occupe aussi la partie noire à droite).

    J'ai testé avec différents formats d'images, et le rendu est toujours le même.
    J'ai vérifié si les largeurs et hauteurs récupérées par GetSize sont corrects : pas de soucis.
    L'affichage se fait de la même manière que lorsque je chargeais mes images avec LoadImage (api windows). Et en réutilisant cette fonction native, je n'ai aucun soucis.

    Sauriez-vous d'où viens le problème ? J'ai eu pas mal de mal à bien saisir les concepts de WIC, je pense que j'ai dû louper quelque chose.

    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 688
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 688
    Points : 13 117
    Points
    13 117
    Par défaut
    Je n'ai jamais travailler avec WIC, mais l'image montre qu'une structure 32 bits est remplie avec une image 24 bits d'où la compression d'un quart et l'altération des couleurs.

    J'aurais plutôt opté pour GDI+ qui permet aussi le chargement de différents formats mais se charge également du rendu sur DC.

Discussions similaires

  1. Conversion d'images
    Par ProgLog dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 13/05/2006, 11h32
  2. conversion d'images
    Par nicoss dans le forum Bibliothèques
    Réponses: 1
    Dernier message: 24/04/2006, 15h14
  3. conversion d'image jpeg en tableau de pixel
    Par sophie86 dans le forum Multimédia
    Réponses: 7
    Dernier message: 09/11/2005, 11h30
  4. Conversion d'images 24/32 Bits -> 16bits
    Par RVP dans le forum Langage
    Réponses: 4
    Dernier message: 30/05/2004, 17h05
  5. Conversion avi->image
    Par lio_on_jb_groove dans le forum DirectX
    Réponses: 1
    Dernier message: 17/07/2003, 10h11

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