begin process at 2012 02 08 08:43:15
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichiers / Disque

 > CONVERTISSEUR D'IMAGES

CONVERTISSEUR D'IMAGES


 Information sur la source

Note :
Aucune note
Catégorie :Fichiers / Disque Niveau :Initié Date de création :17/10/2004 Vu / téléchargé :5 932 / 369

Auteur : Cyberboy2054

Ecrire un message privé
Commentaire sur cette source (1)
Ajouter un commentaire et/ou une note

 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

  • #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;
  • }
#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 :)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

EQUIVALENT A DATE () DU PHP
Source avec Zip BASECODE SDL/OPENGL
Source avec Zip LIBRAIRIE SON [FMOD]
Source avec Zip CONSOLE A LA QUAKE (DANS LA CONSOLE DOS!)
Source avec Zip Source avec une capture TRIANGLE RECURSIF

 Sources de la même categorie

Source avec Zip Source avec une capture GENERE BMP par lajouad
Source avec Zip Source avec une capture GETIONNAIRE D'UNE BIBLIOTHÉQUE EN C par benzarabel
FONCTION D'ÉDITION DE FICHIER BIT À BIT [C-MULTIPLATEFORME] par lynxtyle
Source avec Zip Source avec une capture UN GESTIONNAIRE DU FICHIER par benzarabel
Source avec Zip COPIE DE FICHIERS PAR RESEAU LOCAL par cczerty

Commentaires et avis

Commentaire de ToutEnMasm le 27/11/2010 17:59:42

L'info m'a paru interessante
Le lien a changé  http://openil.sourceforge.net/

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

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

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