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

C Discussion :

Thumbnail en C


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 131
    Points : 95
    Points
    95
    Par défaut Thumbnail en C
    Bonjour
    j'aimerai savoir si il existe un moyen de gérer les thumbnail en C.
    J'ai trouvé sur la Msdn des méthodes en C++ tel que GetThumbnail...mais rien en C.
    Merci

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 860
    Points : 219 064
    Points
    219 064
    Billets dans le blog
    120
    Par défaut
    Bonjour,

    La question qui se pose est : "Qu'est ce que vous entendez pas 'thumbnails'"

    Un thumbnails, c'est une minuature (comme la miniature que l'on peut voir dans les navigateurs de fichiers). Pour en faire une, il soucis d'utiliser un programme (ou une bibliothèque) pour redimensionner l'image (Image Magic est désigné pour ce genre de truc).
    Donc, que voulez vous vraiment faire ?
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le GetThumbnail de GDI+ (qui normalement devrait être utilisable en C avec la GDI+ Flat API) ne fait pas que redimensionner l'image: Si l'image contient déjà elle-même une miniature (c'est le cas de certains JPEG, il me semble), la fonction va l'extraire au lieu d'en créer une nouvelle.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  4. #4
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 131
    Points : 95
    Points
    95
    Par défaut
    Donc en fait je developpe une application C windows qui gère des fichiers présent sur le DD.
    Et je voudrait afficher une miniature de mon fichier dans mon outils ...
    le thumbnail ne s'applique pas qu'au fichier image mais aussi pdf, xls, doc ...

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Dans ce cas, c'est du côté des extensions du shell qu'il faut se tourner.

    Il faut connaître un minimum les principes de COM, mais une fois ça en tête un petit GetUIObjectOfFile en demandant l'interface IThumbnailProvider devrait être un bon départ.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 131
    Points : 95
    Points
    95
    Par défaut
    Bonjour
    et tout d'abord merci pour votre aide qi m'a déjà permis de bien avancer!!!

    Aujourd'hui j'arrive a récupérer des HBITMAP a partir de mes fichiers.

    Et donc à afficher des Thumbnails.
    Cependant dans le cas ou les fichiers ne supportent pas le format thumbnail je souhaite récupérer l'icone ... et la il y a un crash.

    voici le 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
    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
    IExtractIconA * lf_get_icon(IShellFolder *isf_folder, LPITEMIDLIST *pidl_file)
    {
    
    	IExtractIconA *ii_file = NULL;
    
    	if (pidl_file != NULL)
    	{
    		int prgf = 0;
    		isf_folder->lpVtbl->GetUIObjectOf(isf_folder, NULL, 1, pidl_file, &IID_IExtractIcon, &prgf, &ii_file);
    	}
    	
    	if(ii_file == NULL)
    	{
    		isf_folder->lpVtbl->CreateViewObject(isf_folder, NULL, &IID_IExtractIcon, &ii_file);
    	}
    
    	return ii_file;
    } 
    
    HBITMAP lf_extract_icon(IShellFolder *isf_folder, LPITEMIDLIST *pidl_file, BYTE * paz_path , int i_path_size, int dwCX, int dwCY)
    {
    	int i_flags = (int)(GIL_DEFAULTICON|GIL_FORSHELL) ;
    	int i_index = 0;
    	//
    	BYTE			az_path[MAX_PATH] = "";
    	HBITMAP		h_bmp_res = NULL;
    	HICON		phc_IconLarge = NULL;
    	HICON		phc_IconSmall = NULL;
    	ICONINFO		iconInfo;
    	IExtractIconA	*ii_file=NULL;
    	SHFILEINFO		shgfi ;
    	//get icon	
    	ii_file = lf_get_icon(isf_folder, pidl_file);
    	
    	if (ii_file != NULL)
    	{
    		//HICON extract
    		ii_file->lpVtbl->GetIconLocation(ii_file, 0, az_path, sizeof(az_path), &i_index, &i_flags);
    		ii_file->lpVtbl->Extract(ii_file, az_path, sizeof(az_path), &phc_IconLarge, &phc_IconSmall, dwCX + 65536 * dwCX);
    		(...)
    	}
    	else
    	{
    		(...)
    	}
    	//free all
    	(...)
    	
    	return h_bmp_res;
    }
    La ligne rouge me renvoie l'erreur suivante:
    Unhandled exception at 0x7533C4EC (shlwapi.dll) in Win32Project2.exe: 0xC0000005: Access violation reading location 0x00000000.
    si quelqu'un a une idée....

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Je suppose que tu vérifies aussi que isf_folder n'est pas nul?

    De plus, si tu demandes une IExtractIconA, tu dois passer spécifiquement IID_IExtractIconA aux fonctions du shell.


    Au passage: Ne te contente pas de tester le pointeur retourné: Tu dois avant tout tester le HRESULT (avec les macros SUCCEEDED() et FAILED()) retourné par la fonction, car certaines fonctions répondent n'importe quoi quand elles échouent!

    Aussi, ton paramètre pidl_file, tu devrais l'appeler ppidl_file pour éviter la confusion.
    Ou mieux, tu devrais passer juste un PCUITEMID et utiliser son adresse dans ta fonction, c'est plus simple.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 131
    Points : 95
    Points
    95
    Par défaut
    Bonjour,

    Voici un nouveau problème.
    Tout est Ok quand je lance mon programme sous Windows 7

    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
     
    IExtractImage *hbitmap_get_thumbnail(IShellFolder *isf_folder, LPITEMIDLIST *pidl_file)
    {
            IExtractImage *ie_file = NULL;
     
    	if (pidl_file != NULL)
    	{//extract from file
    		int i_prgf = 0;
     
    		isf_folder->lpVtbl->GetUIObjectOf(isf_folder, NULL, 1, pidl_file, &IID_IExtractImage, &i_prgf, &ie_file);
     
    	}
     
    	if(ie_file == NULL)
    	{//Extract from folder
    		isf_folder->lpVtbl->CreateViewObject(isf_folder, NULL, &IID_IExtractImage , &ie_file);
    	}
     
    	return ie_file;
    }
    par contre sous XP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    isf_folder->lpVtbl->GetUIObjectOf(isf_folder, NULL, 1, pidl_file, &IID_IExtractImage, &i_prgf, &ie_file);
    retourn en GetLastError la valeur 126 = ERROR_MOD_NOT_FOUND...

    Cependant d'après la MSDN IID_IExtractImage
    Minimum supported client: Windows 2000 Professional, Windows XP
    Si vous avez une idée pour faire fonctionner cela sous Win XP (90 % de mes clients :p) merci.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    GetLastError n'est pas approprié pour l'utilisation de méthodes COM: C'est le HRESULT qu'il faut voir (et si son mot de poids fort est 0x8007, alors le mot de poids faible est une erreur Win32).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre régulier
    Inscrit en
    Avril 2004
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 131
    Points : 95
    Points
    95
    Par défaut
    Stupide !!!!!!
    Je suis stupide

    ta réponse est parfaite:
    GetLastError n'est pas approprié pour l'utilisation de méthodes COM: C'est le HRESULT qu'il faut voir (et si son mot de poids fort est 0x8007, alors le mot de poids faible est une erreur Win32).
    j'ai donc regardé le HRESULT et il commence par 0x8004.

    cependant c'est le début de ta réponse qui est intéressante
    GetLastError n'est pas approprié pour l'utilisation de méthodes COM
    question: Que fait on lorsque l'on utilise les methodes COM!!!!!!
    on INITIALISE aves CoInitialize(NULL);
    ..
    Je clos le sujet si quelqu un souhaite plus d'info sur les thumbnail en C qu'il me contact.

    MERCI de votre aide.

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

Discussions similaires

  1. Affichage de thumbnails d'un fichier Tiff multipages
    Par twizell dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/07/2006, 21h18
  2. lire les thumbnails d'images JPEG
    Par bertignac dans le forum Multimédia
    Réponses: 5
    Dernier message: 13/07/2006, 08h34
  3. thumbnail et chargement d'image
    Par nabil dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 02/01/2006, 13h27
  4. [ImageMagick] Affichage thumbnail images
    Par poah dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 30/11/2005, 10h58
  5. Thumbnail
    Par remouss dans le forum Général Python
    Réponses: 1
    Dernier message: 31/10/2005, 12h50

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