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

Visual C++ Discussion :

[GDI] Sauvegarder image sur disque


Sujet :

Visual C++

  1. #1
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut [GDI] Sauvegarder image sur disque
    Bonjour,

    Dans mon projet je voudrais sauvegarder un screen shot sur disque en utilisant la lib gdi. Mais j'ai des erreurs bizarre à la compilation.

    Mon bout de code:

    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
     
    #include <gdiplus.h>
     
    using namespace Gdiplus;
     
    BOOL SaveImage(HBITMAP hBmp)
    {
    	Bitmap *image = new Bitmap(hBmp, NULL);
     
    	CLSID myClsId;
    	int retVal = GetEncoderClsid(L"image/bmp", &myClsId);
     
    	image->Save(L"output.bmp", &myClsId, NULL);
     
    	delete image;
     
    	return true;
    }
    Déjà Visual ne reconnait pas la fonction GetEncoderClsid.
    Et plus suprenant j'ai ces erreurs dans gdiplusimaging.h:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Erreur	1	error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut	c:\program files (x86)\windows kits\8.1\include\um\GdiplusImaging.h	79	1	MalDLL
    Erreur	2	error C2440: 'initialisation'*: impossible de convertir de 'const char [37]' en 'int'	c:\program files (x86)\windows kits\8.1\include\um\GdiplusImaging.h	79	1	MalDLL
    Erreur	3	error C2146: erreur de syntaxe*: absence de ';' avant l'identificateur 'IImageBytes'	c:\program files (x86)\windows kits\8.1\include\um\GdiplusImaging.h	79	1	MalDLL
    Erreur	4	error C2143: erreur de syntaxe*: absence de ';' avant ':'	c:\program files (x86)\windows kits\8.1\include\um\GdiplusImaging.h	79	1	MalDLL
    Merci de votre aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    https://msdn.microsoft.com/en-us/lib...(v=vs.85).aspx

    Peut-on voir la tête de la ligne 79 de GdiplusImaging.h ?

  3. #3
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    La première et seconde ligne donc 78 et 79 dans le fichier, sont surlignés en rouge

    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
     
    MIDL_INTERFACE("025D1823-6C7D-447B-BBDB-A3CBC3DFA2FC")
    IImageBytes : public IUnknown
    {
    public:
        // Return total number of bytes in the IStream
     
        STDMETHOD(CountBytes)(
            OUT UINT *pcb
            ) = 0;
     
        // Locks "cb" bytes, starting from "ulOffset" in the stream, and returns the
        // pointer to the beginning of the locked memory chunk in "ppvBytes"
     
        STDMETHOD(LockBytes)(
            IN UINT cb,
            IN ULONG ulOffset,
            OUT const VOID ** ppvBytes
            ) = 0;
     
        // Unlocks "cb" bytes, pointed by "pvBytes", starting from "ulOffset" in the
        // stream
     
        STDMETHOD(UnlockBytes)(
            IN const VOID *pvBytes,
            IN UINT cb,
            IN ULONG ulOffset
            ) = 0;
    };

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Il vous manque la définition de la MACRO MIDL_INTERFACE
    http://thrysoee.dk/InsideCOM+/ch02b.htm
    Vérifiez l'ordre d'inclusion des en-têtes (Windows.h en premier) et des constantes de compilation.

  5. #5
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    J'ai essayer de bricolé les headers et options de compilations, pour l'instant j'ai ceci, mais ca failed toujours,

    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
     
    #include "windows.h"
    #include "stdafx.h"
    #include <stdio.h>
    #include <Lmcons.h>
    #include <cstdio>
    #include <tlhelp32.h>
    #include <iostream>
    #include <string>
    #include <cstring>
    #include <WININET.h> 
    #include <gdiplus.h>
     
    #define _DEBUG
    #pragma comment(lib, "Wininet.lib")
     
    using namespace std;
     
    BOOL SaveImage(HBITMAP hBmp, LPCWSTR lpszFilename, ULONG uQuality)
    {
    Bitmap *image = new Bitmap(hBmp, NULL);
     
    	CLSID myClsId;
    	int retVal = GetEncoderClsid(L"image/bmp", &myClsId);
     
    	image->Save(L"output.bmp", &myClsId, NULL);
     
    	delete image;
     
    	return true;
    }
    J'avais vu que cette macro était déinfi dans rpcndr.h, mais si je l'ajoute j'ai plein d'erreur sur ce header...

    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Erreur	1	error C2146: erreur de syntaxe*: absence de ';' avant l'identificateur 'LookupContext'	C:\Program Files (x86)\Windows Kits\8.1\Include\um\rpcnsip.h	34	1	MalDLL
    Erreur	2	error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut	C:\Program Files (x86)\Windows Kits\8.1\Include\um\rpcnsip.h	34	1	MalDLL
    Erreur	3	error C2146: erreur de syntaxe*: absence de ';' avant l'identificateur 'ProposedHandle'	C:\Program Files (x86)\Windows Kits\8.1\Include\um\rpcnsip.h	35	1	MalDLL
    Erreur	4	error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut	C:\Program Files (x86)\Windows Kits\8.1\Include\um\rpcnsip.h	35	1	MalDLL
    Erreur	5	error C2143: erreur de syntaxe*: absence de ';' avant '*'	C:\Program Files (x86)\Windows Kits\8.1\Include\um\rpcnsip.h	36	1	MalDLL
    Aure question surement bête, mais je suis un peu perdu avec toutes ces dépendances..., je suis sous windows 7 et ces headers sont dans C:\Program Files (x86)\Windows Kits\8.1\Include\um. Le 8.1 c'est la version de windows je suspose, ca ne pose pas de problème?

    EDIT:

    En ajoutant #include <objidl.h> avant gdiplus, je n'ai plus ces erreurs. Ca compile, mais ca crash, j'ai une violation d'acces "Exception non gérée à 0x77709E33 (ntdll.dll)" :'(

    A priorie c'est vers GetImageEncodersSize(&num, &size); dans GetEncoderClsid (copie paste de la msdn)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Cela redevient un bug standard.
    Que dit le débogueur ?

  7. #7
    Membre actif
    Avatar de Blo0d4x3
    Inscrit en
    Octobre 2003
    Messages
    583
    Détails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 583
    Points : 265
    Points
    265
    Par défaut
    Quand j'arrive a if(size==0)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    UINT  num = 0;          // number of image encoders
    	UINT  size = 0;         // size of the image encoder array in bytes
     
    	ImageCodecInfo* pImageCodecInfo = NULL;
     
    	GetImageEncodersSize(&num, &size);
    	if (size == 0)
    		return -1;  // Failure
    J'ai ce message:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Exception de première chance à 0x77709E33 (ntdll.dll) dans Launcher.exe*: 0xC0000005*: Violation d'accès lors de l'écriture à l'emplacement 0x00000014.
    Exception non gérée à 0x77709E33 (ntdll.dll) dans Launcher.exe*: 0xC0000005*: Violation d'accès lors de l'écriture à l'emplacement 0x00000014.
    Ma fonction est appellé comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Bitmap *image = new Bitmap(hBmp, NULL);
     
    		CLSID myClsId;
    		int retVal = GetEncoderClsid(L"image/bmp", &myClsId)

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    C'est une API C
    https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx
    Il faut donc toujours vérifier la valeur de retour de la fonction.
    https://msdn.microsoft.com/en-us/lib...=vs.85%29.aspx

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/01/2011, 17h36
  2. Sauvegarder PDF sur disque dur
    Par jotheouf dans le forum ActionScript 3
    Réponses: 3
    Dernier message: 08/10/2010, 19h15
  3. Tranfert d'un fichier image sur disque dur externe
    Par jp_developpeur dans le forum Windows XP
    Réponses: 6
    Dernier message: 27/08/2009, 09h29
  4. [BufferedImage] Redimensionner / Sauvegarder image sur disque
    Par nicolas.pied dans le forum Multimédia
    Réponses: 1
    Dernier message: 17/04/2007, 02h54
  5. enregistrer image sur disque avec URL
    Par meufeu dans le forum Langage
    Réponses: 8
    Dernier message: 26/10/2005, 12h55

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