begin process at 2012 05 28 23:07:14
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

GUI

 > 

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


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

lundi 16 juin 2008 à 15:02:06 | Convertion d'une image en GIF à partir de GDI+.

lol55

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


lundi 16 juin 2008 à 20:57:11 | Re : Convertion d'une image en GIF à partir de GDI+.

yann_lo_san

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.
lundi 16 juin 2008 à 21:35:32 | Re : Convertion d'une image en GIF à partir de GDI+.

lol55

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 !
mardi 17 juin 2008 à 20:47:38 | Re : Convertion d'une image en GIF à partir de GDI+.

yann_lo_san

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

mercredi 18 juin 2008 à 22:20:17 | Re : Convertion d'une image en GIF à partir de GDI+.

lol55

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 ! ;)
jeudi 19 juin 2008 à 20:37:39 | Re : Convertion d'une image en GIF à partir de GDI+.

yann_lo_san

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



Cette discussion est classée dans : image, conversion, gif, pngclsid, pimagecodecinfo


Répondre à ce message

Sujets en rapport avec ce message

conversion image tiff à bmp [ par mouss8 ] je voudrais savoir comment récupéré les données dans une image tiff et bmp ou savoir la composition de ces fichiers (en-tete,info image, donné) image gif dans un programme MFC [ par ventreapatte ] don't worry be happyJe réalise un programme MFC.Je voudrais parcourir une image au format Gif pixels par pixels et récupérer les coordonnées et 3 comp conversion couleur noir & blanc [ par scudi ] Bonjour! j aimerai savoir comment faire pour changer une image en couleur en noir et blanc. Je sait qu il faut changer la palette de l image (je trait C : conversion d'image cvouleur en noir et blanc [ par nemege ] salut,j'aimerais savoir comment faire en C pour convertir une image couleur en noir et blanc ???merci . lecture image GIF [ par alavelin ] J'aimerais savior s'il est possible de mettre une image gif dans un tableau, exclusivement en language C et non C++. Dans le cadre d'une application p librairies conversion d'image [ par com_8 ] je recherche des librairies sur linux pour convertir une image jpg en bmp conversion d image [ par chicox ] Je cherche un code en C++ correspondant a l algorithme de Huffman et permettant de compresser/decompresser des images binaires (de tout type ,.jpeg,et conversion en BMP [ par anthony00 ] voila je suis sur un projet de traitement d'image. je souhaiterai savoir comment on peu charger une image au format BMP sous forme matricielle sous vi Conversion image BMP 24bits --> 8 bits [ par vincentz ] Bonjour,Etudiant en 4ème année d'école d'ingénieur, dans le cadre de mon projet de fin d'année, j'ai besoin de programmer en C une conversion  Image B conversion hexa -image [ par kayser33 ] Bonjour a tousJe cherche à afficher une image ndg à partir de données hexadécimales récupérées via un terminal?Merci de votre aide


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
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,920 sec (3)

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