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