Convertion ps en noir et blanc

Soyez le premier à donner votre avis sur cette source.

Snippet vu 4 684 fois - Téléchargée 20 fois

Contenu du snippet

Petit executable qui converti une liste de fichiers PostScript en noir et Blanc, ne converti que les lignes, pas les images.

Source / Exemple :


#include <cstdlib>
#include <iostream>
#include <fstream>
#include <iterator>
#include <cstring>
#include <vector>
#include <sstream>

void Dip_Help();

using namespace std;
bool isNumeric(const string &atester);
vector<string>  dec( string str);

int main(int argc, char *argv[])
{
    
    /**on va convertir des fichier ps - couleur en noir et blanc.
    Comment sa marche ?
    Dans les postScript, les coleurs des lignes (pas des images, pour ces dernieres sa ne fait rien) sont définie par :
         # # # rgb
         ou # # # correspond au code RGB (rouge par ex : 1 0 0 rgb)...
         donc on recherche les rgb, on fait gaffe à ce que sa soit bien un code couleur (preceder de trois chiffres, pas de chr)
         et on remplace par "0 0 0 rgb"
    y a t'il des argc?

  • /
if ( argc == 1) { Dip_Help() ; return 1; } //1° boucle sur les args : int i; for(i=1 ; i<argc ; i++) { cout << "Traitement de : " << argv[i] << endl; //verification que le fichier existe : ifstream file( argv[i] ); string line; string te = "c:\\temp\\convert_.ps"; ofstream fp(te.c_str() , ios::out|ios::binary); //fp = fopen(, "w") ; while ( getline( file, line )) { if ( line.find("rgb") < line.size()) { vector<string> temp = dec(line); vector<string>::reverse_iterator c1_Iter; c1_Iter = temp.rbegin(); bool modif = false; int max0 = 0; for (; c1_Iter != temp.rend(); c1_Iter++) { if (*c1_Iter == "rgb") { max0 = 0; modif = true; }else{ if (!isNumeric(*c1_Iter) || max0 == 3) modif = false; } if (modif == true && *c1_Iter != "rgb" ) {
  • c1_Iter = "0";
max0 +=1; //cout << *c1_Iter << endl; } //la on met à jour la ligne } ostringstream oss; copy( temp.begin(), temp.end(), ostream_iterator<string>( oss, " " ) ); line = oss.str(); //cout << line << endl; } //la on ajoute la ligne au nouveaux fichier : //cout << line << endl; fp << line; fp << "\n"; } fp.close(); file.close(); //copy du fichier à la place du deuxieme : ofstream file_ecr( argv[i] , ios::in|ios::binary ); ifstream fp_re(te.c_str() , ios::out|ios::binary); while ( getline( fp_re, line )) file_ecr << line << "\n"; file_ecr.close(); //effacement fichier temp : cout << remove(te.c_str()) << endl; } system("PAUSE"); return EXIT_SUCCESS; } void Dip_Help() { cout << "Utlisation du logiciel : " << endl; cout << "PS_NB.exe \"Nom_du_prmier_fichier\" \"Nom_du_deuxieme_fichier\" \"...\" " << endl; } vector<string> dec(string str) { vector<string> str_list; // liste de mots // remplir la liste de mots istringstream iss( str ); copy( istream_iterator<string>( iss ), istream_iterator<string>(), back_inserter( str_list ) ); return str_list; } bool isNumeric(const string &atester) { const char *c = atester.c_str(); while(*c) { if ((*c<'0' || *c>'9') && *c!='.') return 0; c++; } return 1; }

Conclusion :


Voila sa peut peut etre servir à quelqu'un, par contre n'hésité pas sur les commentaires sur le code en lui-même, c'est un de mes prmier, je debute...

A voir également

Ajouter un commentaire Commentaires
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
Si c'est une classe string, il doit surement exister une méthode pour faire une comparaison.
string.compare je crois.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
On ne peut même pas faire ça en Java alors en C++...
Messages postés
30
Date d'inscription
dimanche 22 mai 2005
Statut
Membre
Dernière intervention
19 mars 2009

OK, j'ais commencé en VB, sa doit vennir de la ;)
Pourtant sa marche, c1_inter est un iterateur, pour acceder a sa valeur je suis obliger de passer par *, le fait que ce soit un std::string et non un *char ne change pas la facon de comparer?
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
"on compte le nombre de caractères rencontrés jusqu'à tomber sur le 0 de fin de chaine."

Oups. Ça c'est pour strlen.
Pour tester deux chaines, on compare chacun des caractères de la chaine 1 avec ceux de la chaine 2.
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
15
On ne test jamais une chaine de caractère ainsi. Une chaine de caractère, dans un code compiler, sera transformé en une adresse pointant vers la zone contenant la chaine. Ce que tu fais revient à tester 2 adresses mémoire différentes. La condition ne sera jamais vrai.

Pour tester une chaine, on compte le nombre de caractères rencontrés jusqu'à tomber sur le 0 de fin de chaine. C'est ce que fais la fonction strcmp.
Afficher les 11 commentaires

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.