Convertion d'une image en GIF à partir de GDI+.

cs_lol55 Messages postés 86 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 5 décembre 2010 - 16 juin 2008 à 15:02
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 - 19 juin 2008 à 20:37
Bonjour à tous,

Je parviens à l'aide de GDI+ à convertir une image BMP en JPG, PNG et TIF en ayant une image de bonne qualité mais lorsque je tente de la convertir en GIF, la qualité est assez dégradée ! Vous pouvez le voir sur cette image que j'utilise pour tester la conversion : Image GIF. Je souhaiterais améliorer le rendu de l'image lorsqu'elle est convertit en GIF, mais comment faire ? Je bloque sur ce problème depuis plusieurs semaines. Merci beaucoup d'avance pour votre aide !

Voici mon code :

#include <windows.h>
#include <stdio.h>

#include <gdiplus.h>

using namespace Gdiplus;

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid);

int WinMain (HINSTANCE cetteInstance, HINSTANCE precedenteInstance, LPSTR LigneCommande, int Affichage)
{
    ULONG_PTR gdiplusPtr;
    GdiplusStartupInput gdiplusStart;
   
    GdiplusStartup (&gdiplusPtr, &gdiplusStart, NULL);
   
    Bitmap *image = new Bitmap(L"image.bmp");
   
    CLSID pngClsid;
    Status EtatImage; // http://msdn2.microsoft.com/en-us/library/ms534175.aspx
   
    // GetEncoderClsid(L"image/jpeg", &pngClsid);
    // GetEncoderClsid(L"image/png", &pngClsid);
    // GetEncoderClsid(L"image/tiff", &pngClsid);
    GetEncoderClsid(L"image/gif", &pngClsid); // http://msdn.microsoft.com/en-us/library/ms533843(VS.85).aspx
   
    // EtatImage = image->Save(L"conversion.jpg",&pngClsid, NULL);
    // EtatImage = image->Save(L"conversion.png",&pngClsid, NULL);
    // EtatImage = image->Save(L"conversion.tif",&pngClsid, NULL);
    EtatImage = image->Save(L"conversion.gif", &pngClsid, 0);
  
    if (EtatImage == Ok)
        MessageBox(NULL, "Image convertie !", "Conversion", MB_ICONINFORMATION);
  
    else
        MessageBox(NULL, "Problème de conversion !", "Conversion", MB_ICONINFORMATION);
  
    delete image;
  
    GdiplusShutdown(gdiplusPtr);
  
    return TRUE;
}

int GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
    UINT  num = 0;          // nombre d'encodeurs
    UINT  size = 0;         // taille en BYTE
   
    ImageCodecInfo* pImageCodecInfo = NULL;
   
    GetImageEncodersSize(&num, &size); // Récupération du nombre d'encodeurs et leur taille totale.
    if (size == 0)
        return -1;
   
    pImageCodecInfo = (ImageCodecInfo*) malloc(size); // allocation mémoire pour stoquer les infos sur les codecs (pas de VirtualAlloc sinon erreur avec un objet GDI+
    if (pImageCodecInfo == NULL)
        return -1; 
   
    GetImageEncoders(num, size, pImageCodecInfo); //Récupération des infos des codecs
   
    for (UINT j = 0; j < num; ++j) // On cherche le codec que l'on veux dans la liste
    {
        if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0 )
        {
            *pClsid = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return j; 
        }   
    }
   
    free(pImageCodecInfo); // Libération mémoire
   
    return -1;
}

5 réponses

yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
16 juin 2008 à 20:57
Salut,

As tu essayé de passer par le type Image à la place de Bitmap et de charger depuis un stream (::FromStream())
Peut etre que l'image aura un meilleur rendu.
0
cs_lol55 Messages postés 86 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 5 décembre 2010
16 juin 2008 à 21:35
Merci pour ton aide, j'ai remplacé Bitmap par Image de cette façon :
Image *image = new Bitmap(L"image.bmp");
Cela ne change rien à la qualité de l'image obtenue.

Je n'arrive pas à charger depuis un stream (http://msdn.microsoft.com/en-us/library/system.drawing.image.fromstream.aspx), comment faire !? Et au faite, qu'est-ce qu'un stream en programmation ?

Encore merci pour ton aide !
0
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
17 juin 2008 à 20:47
Salut,

Il suffit de passer par un conteneur temporaire (qui sert à stocker 10 images par exemple dans le même fichier)
Avec cette fonction, j'obtiens un GIF à partir d'un BMP d'une qualité exceptionnelle !
j'ai enlevé les code d'erreur qu'il faudra remettre (COM)

Status

MakeGifFile(constWCHAR* file
)
{
   
IStorage* pIStorage =NULL;
   
IStream* pIStream1 =NULL;
   
Image* pGif =NULL;
   
Status stat = Ok;

   
Image imgSource(file);

   
CoInitialize(NULL);

   
StgCreateDocfile(
            
L"ConteneurTemp.cmp", 
            
STGM_READWRITE|STGM_CREATE|STGM_SHARE_EXCLUSIVE, 
            
0, 
            
&pIStorage);
           
   
pIStorage->CreateStream(
            
L"NomStreamImage",
            
STGM_READWRITE|STGM_SHARE_EXCLUSIVE,
            
0,
            
0,
            
&pIStream1);
   // GIF encoder.
   
CLSID gifClsid;
   
GetEncoderClsid(L"image/gif",&gifClsid);




   // Sauve le conteneur
   


stat = imgSource.Save(pIStream1,&gifClsid);
   
   

pGif = Image::FromStream(pIStream1);
   

pGif->Save(L"monImage.gif",&gifClsid


);






   if
(pIStream1) pIStream1->Release(); 
   


if
(pIStorage) pIStorage->Release();
   


if
( pGif )delete pGif;
   


CoUninitialize
();

   



return stat


;

}
0
cs_lol55 Messages postés 86 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 5 décembre 2010
18 juin 2008 à 22:20
Merci énormément pour ce code mais j'obtiens exactement la même qualité !
Je ne comprends vraiment pas pourquoi ! Est-ce lié à la version de la dll ? Je possède la version 5.1.3102.2180; elle se nomme gdiplus.dll.
As-tu une idée !?

Peux-tu me montrer le rendu de qualité que tu obtiens ?
Merci beaucoup ! ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yann_lo_san Messages postés 1137 Date d'inscription lundi 17 novembre 2003 Statut Membre Dernière intervention 23 janvier 2016 26
19 juin 2008 à 20:37
Salut,

Dans tous les cas il est normal de perdre de la qualité,
tu n'as qu'a examiner la taille de l'image source et la taille du gif généré (20% à 30% de compression du au format)

Je ne pense pas que tu puisses obtenir mieux pour du bitmap vers gif.

La seule façon d'avoir une belle qualité est d'utiliser une image source avec 256 couleurs maximum.

A plus...
0
Rejoignez-nous