Convertisseur d'images

Soyez le premier à donner votre avis sur cette source.

Vue 7 137 fois - Téléchargée 467 fois

Description

Convertisseur d'images par lignes de commandes ...
Il convertit a peu près tout vers tout ... enfin, dans la limite des capacités de DevIL
Pas de bugs connus il me semble, mais la qualité de conversion laisse a désirer, on ne peut pas spécifier le taux. Le programme utilise DevIL pour la conversion ( www.imagelib.org ), donc si vous connaissez la fonction pour faire ca ... je prends ;)
Ca ne compile pas sous linux, mais ca ne doit pas etre très difficile a porter dans la mesure ou vous connaissez les fonctions pour lister le contenu d'un repertoire, car on peut convertir tout un repertoire, ses sous dossiers, supprimer les fichiers a convertir après la conversion ...
Allez voir le zip si vous voulez un exe ;)

Source / Exemple :


#include <stdio.h>
// pour devil
#include <il\il.h>
#include <windows.h>
#include <string>

/*
	Les options

  • /
enum OPT { OPT_NO = 0, // pas d'options OPT_DEL = (1 << 1), // supprimer les fichiers de départ OPT_SUB = (1 << 2) // modifier les sous dossiers }; int g_Options; /* Initialise devil
  • /
void Init () { if ( ilGetInteger(IL_VERSION_NUM) < IL_VERSION ) printf ("Version de DevIL incorrecte\n"); ilInit (); ilEnable (IL_FILE_OVERWRITE); } /* Convertit le fichier src en un fichier dst
  • /
int FileConvert (std::string src, std::string dst) { if (!src.c_str() || !dst.c_str()) return 0; printf ("Conversion de %s vers %s\n", src.c_str(), dst.c_str()); if (!ilLoadImage( (char* const)src.c_str() ) ) { printf ("Impossible de charger %s\n", src.c_str()); return 0; } if (!ilSaveImage( (char* const)dst.c_str() ) ) { printf ("Impossible de sauvegarder %s\n", dst.c_str()); return 0; } printf ("Conversion reussie\n"); return 1; } int wild_match(char *wildcard, char *string) { char *c, *d; /*deux pointeurs qui serviront en cas d'échec de matching*/ while (*wildcard != 42 && *wildcard != 0) { if (!*string) return 0; /*string est nulle et wildcard ne l'est pas on retourne 0*/ /*si le caractère *string est le même que *wildcard ou si *wildcard est un point d'interrogation (?=n'importe quel caractère)...*/ if ((*string == *wildcard) || (*wildcard == 63)) { string++; wildcard++; } else return 0; } //si il reste des caractères à vérifier dans string et que il n'y en a plus aucun dans wildcard.. if (*string && !*wildcard) return 0; while (*wildcard == 42) wildcard++; /*pour permettre de passer les * en trop (**,***,etc.)*/ if (!*wildcard) return 1; /*le dernier caractère du wildcard est un * et comme les caractères d'avant on été vérifiés le wildcard valide donc la chaîne*/ /*début du motif, on configure les pointeurs*/ c = wildcard; d = string; while (*string) { if (*wildcard == 42) { while (*wildcard == 42) wildcard++; /*pour permettre de passer les * en trop (**,***,etc.)*/ if (!*wildcard) return 1; /*début du motif, on configure les pointeurs*/ c = wildcard; d = string; } else if ((*string == *wildcard) || (*wildcard == 63)) { string++; wildcard++; } /*en cas d'échec du matching du motif , on remettra wildcard à sa position de départ (début du motif) ainsi que string, qu'on avancera de 1 afin de tester toutes les combinaisons*/ else { string = ++d; wildcard = c; } } while (*wildcard == 42) wildcard++; if (!*wildcard) return 1; /* si wildcard contient un caractère autre que * et '\0', il ne vérifie donc pas la chaîne*/ return 0; } /* Conversion d'un repertoire de fichiers
  • /
int SerialConvert (std::string rep, char* wild, char* ext) { WIN32_FIND_DATA IpFindFileData; HANDLE hHandle; // On initialise le handle std::string total_path = rep + "*.*"; hHandle = FindFirstFile(total_path.c_str(), &IpFindFileData); // Le fichier de destination std::string str; do { // on saute les répertoires if (IpFindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // inclure les sous dossiers ? if (g_Options & OPT_SUB) { if (strcmp (IpFindFileData.cFileName, ".") != 0 && strcmp (IpFindFileData.cFileName, "..") != 0) SerialConvert (rep + IpFindFileData.cFileName + "/", wild, ext); } else continue; } if (! wild_match (wild, IpFindFileData.cFileName)) continue; str = (rep + std::string ( IpFindFileData.cFileName )).c_str(); // on cherche l extension int id = str.length(); char*c = &str[id]; // on se met au dernier / while (*c != '/') { id--; c--; } // on evite les chaines incorrectes // on se positionne sur le caractere '.' while (*c != '\0') { if (*c=='.') break; id++; c++; } // et recopie l'extension str.replace(id+1, strlen(ext), std::string(ext)); // et convertit le nouveau fichier FileConvert ( rep + IpFindFileData.cFileName, str.c_str() ); // si on demande de supprimer les anciens fichiers ... on le fait if (g_Options & OPT_DEL) DeleteFile ( (std::string(rep + IpFindFileData.cFileName)).c_str() ); }while (FindNextFile(hHandle,&IpFindFileData)); // On ferme le handle FindClose(hHandle); return 1; } /* Message d'aide
  • /
void Help () { printf ("Il faut au moins 2 arguments :\n" " - le premier, indiquant le nom des fichiers a convertir :\n" " ex: plop.png ou *.png\n " " - le second, le format de sortie :\n" " ex : png, bmp, jpg...\n" "Exemple d\'appel au programme:\n" " imgconv *.bmp png\n" "Options supplementaires :\n" " -d : supprime les anciens fichiers\n " " -s : renomme egalement les fichiers inclus dans les sous dossiers\n" " -h ou -help : affiche l\' aide ici presente ;)\n\n"); } int main (int argc, char** argv) { Init (); // Verifie qu'il y ait bien un minimum de parametres if (argc < 3) { Help (); system ("PAUSE"); } else { /* Ajoute les options
  • /
for (int i = 3; i<argc; i++) { if (strcmp(argv[i], "-d")==0) g_Options |= OPT_DEL; if (strcmp(argv[i], "-s")==0) g_Options |= OPT_SUB; if (strcmp(argv[i], "-h")==0 || strcmp(argv[i], "-help")==0) Help (); } // convertit le repertoire ou se trouve l'exe return SerialConvert ("./", argv[1], argv[2]); } return 0; }

Conclusion :


Amusez vous bien :)

Codes Sources

A voir également

Ajouter un commentaire

Commentaire

ToutEnMasm
Messages postés
552
Date d'inscription
jeudi 28 novembre 2002
Statut
Membre
Dernière intervention
26 mars 2016
1 -
L'info m'a paru interessante
Le lien a changé http://openil.sourceforge.net/

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.