begin process at 2008 07 06 12:58:48
1 205 544 membres
121 nouveaux aujourd'hui
14 119 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CONVERTION PS EN NOIR ET BLANC


Information sur la source

Catégorie :Application Classé sous : postscript, convertion, noir blanc, ecriture fichier Niveau : Débutant Date de création : 28/11/2007 Date de mise à jour : 28/11/2007 09:39:57 Vu : 2 129

Note :
Aucune note

Commentaire sur cette source (11)
Ajouter un commentaire et/ou une note

Description

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

Source

  • #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;
  • }
#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...
28 novembre 2007 09:39:57 :
fautes
  • signaler à un administrateur
    Commentaire de ndubien le 29/11/2007 14:34:04

    Ma question va sans doutes paraître bête mais qu'est-ce qu'un PostScript?

  • signaler à un administrateur
    Commentaire de CerberusAbaka le 29/11/2007 16:41:27

    Ba un .ps, l'ancetre du pdf.
    Les librairie comme GostScript utilise ce format. Il sert à l'impression surtout, c'est vrai qu'il existe depuit fort lontemp, mais il est encore trés utilisé (enfin je pense lol).

    have a nice day

  • signaler à un administrateur
    Commentaire de SAKingdom le 29/11/2007 17:19:59

    if (*c1_Iter == "rgb")
    if (modif == true && *c1_Iter != "rgb" )

    Ça n'inquiète personnes ces deux ligne ci dessus ?

  • signaler à un administrateur
    Commentaire de darunia le 29/11/2007 18:19:31

    Je confirme, le format PS est très utilisé en entreprise (surtout pour les impressions de masse)

  • signaler à un administrateur
    Commentaire de ndubien le 29/11/2007 18:25:40

    Donc le .ps c'est "l'ancêtre" du .pdf... Merci pour ta réponse CerberusAbaka, A+

  • signaler à un administrateur
    Commentaire de CerberusAbaka le 30/11/2007 08:19:14

    if (*c1_Iter == "rgb")
    if (modif == true && *c1_Iter != "rgb" )

    Ça n'inquiète personnes ces deux ligne ci dessus ?

    Sa devrai? Je suis la pour apprendre, argumenter.

    en fait, on parcour la ligne à l'envert (for (; c1_Iter != temp.rend(); c1_Iter++))
    si on tombe sur un "rgb", c'est que les valeur qui vienne sont suceptible d'être modifiées.

    Mais il y a des cas ou il ne faut pas (par exemple si il y a des image dans le fichier, on peut avoir un "rgb", mais si on modifie les valeurs... ba sa marche pas forcement)

    La regle c'est : "si RGB, modifie les 3 valeur numeric qui precede"



    "Donc le .ps c'est "l'ancêtre" du .pdf... Merci pour ta réponse CerberusAbaka, A+"
    Oui, je suis dans une boite de mecanique, on fait des plans et on s'en sert ennormement; en fait le pdf, c'est du postscript encapsulé.

  • signaler à un administrateur
    Commentaire de SAKingdom le 30/11/2007 18:20:45

    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.

  • signaler à un administrateur
    Commentaire de SAKingdom le 30/11/2007 19:14:49

    "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.

  • signaler à un administrateur
    Commentaire de CerberusAbaka le 03/12/2007 08:20:41

    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?

  • signaler à un administrateur
    Commentaire de SAKingdom le 03/12/2007 17:54:10

    On ne peut même pas faire ça en Java alors en C++...

  • signaler à un administrateur
    Commentaire de SAKingdom le 03/12/2007 21:47:21

    Si c'est une classe string, il doit surement exister une méthode pour faire une comparaison.
    string.compare je crois.

Ajouter un commentaire

Discussions en rapport avec ce code source

Pub



Appels d'offres

Plugin Dialer outlook
Budget : 2 000€
Travail graphique- ill...
Budget : 1 000€
creation de marque et ...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS