Traiter les images en c

Discutez d'informatique ici !
Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

Traiter les images en c

par Rockleader » 12 Nov 2015, 03:03

Bonsoir à tous,

Question qui paraîtra peut être bête; en cherchant un peu de doc, j'ai vu qu'il existait tout un tas de bibliothèque afin de gérer le traitement d'image pour à peu près tous les formats en c.

Mais, à chaque fois tout est plus ou moins spécifique à un seul format.


Admettons que je veuille faire une fonction qui prend un contenu de fichier et le recopie dans un fichier résultat et ce, peut importe la nature de base du fichier, que ce soit texte ou image.

J'ai testé pas mal de truc, plus ou moins bizarre et je n'arrive jamais à obtenir une copie d'image ><
Je commence donc légèrement à perdre patience =)

Merci d'avance pour n'importe quelle bribe d'info sur le sujet :lol3:
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !



Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 12 Nov 2015, 09:39

Bonjour,

Utilises-tu le mode binaire de l'ouverture / ecriture de tes fichiers ?

Peux-tu nous montrer ta fonction de copie peut-être que tu rajoutes un caractère dans le fichier qui "casse" le format du fichier (même le moindre \n en plus casse le format d'une image).

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 12 Nov 2015, 12:17

Je n'ai pas le code sous les yeux tout de suite, mais oui je le lis bien en binaire, du mois je crois je vérifierai.

Le fait que j'écrive la totalité de mon buffer via un printf en ayant prit soin de faire un dup du file descriptor sur l'entrée de l'écran pourrait il être la cause de ce problème ?


Il est fortement possible que je rajoute un \0 à la fin du buffer aussi, mais si le fichier est du texte c'est nécessaire donc...

Bref, je vous mets le code de cette fonction plus en détail dans la soirée.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 12 Nov 2015, 13:08

Quand tu travailles avec des fichiers en binaire il faut utiliser les fonctions, fread et fwrite pour la lecture et l'écriture.

fprintf / fgets sont réservés lorsque tu traites des chaines de caractères.

Pourquoi fais-tu un dup ?

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 12 Nov 2015, 15:00

Le dup, c'est juste pour m'économiser une fonction. sa me permet d'utiliser la même fonction pour afficher en console que pour écrire dans le fichier. Mais si c'est une cause du problème qui m'empêche de réaliser ce que je veux je peux faire une fonction juste pour écrire aussi c'est pas tellement dérangeant.

Bref, j'ai pu récupérer le code.

Dans mon cas, en fait je lis dans une socket (ce qui complique un peu le problème^^)

Code: Tout sélectionner
// fonction qui récupère le fichier envoyé par le serveur puis l'écrit, soit sur l'écran, soit sur un autre fichier après dup
void affiche_fichier(int socket, int taille)
{
    int k;
    if ( taille >0 ){
        char buffer[taille];
        for (k = 0; k < taille;k++){
            read(socket, &buffer[k], 1);
        }   
        buffer[taille] = '\0';
        printf("%s",buffer);
    }
}


Effectivement je mettais bien le \0 pour compléter mon buffer.

La taille représente la taille de mon fichier que je calcule comme ceci

Code: Tout sélectionner
int taille_fichier(char *filename){
    FILE *fich;
    int taille;
 
    fich = fopen(filename, "rb");
    if(fich){
        fseek(fich, 0, SEEK_END); 
        taille =ftell(fich);
        fclose(fich); 
        return taille;   
    }
    return 0;
}



Par contre, je ne sais pas vraiment comment les données sont envoyé sur la socket puisque je n'utilise pas vraiment un vrai serveur.

Pour faire mes tests, je fais un truc de ce style là qui remplace mon serveur dans la console

Code: Tout sélectionner
while true; do nc -l numPort <fichierAtransmettre;done


Du coup, quand je fais ça, je ne sais pas si le fichier est bien envoyé en binaire ou non; ce que je peux affirmer c'est que ça marche comme il faut avec les chaines.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 12 Nov 2015, 15:56

Cela ne complique pas de beaucoup ton problème.

Les fonctions printf, fprintf ne sont pas des fonctions que tu peux utiliser lorsque tu n'es pas sûr que le résultat est du texte.

Tu devrais plutôt utiliser la fonction write pour écrire exactement le nombre d'octet tu as récupéré.

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 12 Nov 2015, 22:49

On dirait que comme d'hab tu avais raison merci beaucoup :lol3:

J'ai tenté d'écrire ce que je lisais petit à petit sans le \0 de fin en passant par un write et ça a marché.

C'est génial merci beaucoup !!!

Modulo le fait que je n'ai pas testé le second fichier cette copie "locale" a bien marché.

Code: Tout sélectionner
int fd=open("soleil.jpg",O_RDWR,0644);
   int fd2=open("soleil2",O_RDWR|O_CREAT,0644);
   int taille=taille_fichier("soleil.jpg");
    if(fd!=-1){
          if ( taille >0 ){
              int k;
              char buffer[taille];
              for (k = 0; k < taille;k++){
               read(fd, &buffer[k],1);
               write(fd2,&buffer[k],1);
           }   
           buffer[taille] = '\0';
       }
   }else{
      error("ouverture fichier");
   }


J'ai pas testé avec la socket, je vais le faire, mais il n'y a pas de raison que ça change quoi que ce soit ;)

Encore merci !
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

Avatar de l’utilisateur
ampholyte
Membre Transcendant
Messages: 3940
Enregistré le: 21 Juil 2012, 08:03

par ampholyte » 13 Nov 2015, 09:52

Pas de problème, petit conseil, lorsque tu travailles avec des fichiers (sauf cas spécifique) tu peux utiliser des fonctions fopen / fread / fwrite qui sont spécifiques au fichier.

En rajoutant la socket, cela ne change strictement rien =).

Avatar de l’utilisateur
Rockleader
Habitué(e)
Messages: 2126
Enregistré le: 11 Oct 2011, 19:42

par Rockleader » 13 Nov 2015, 11:10

Ben, en fait, en multi tache on nous fait travailler avec les primitives unix open write read etc etc du coup les habitudes restent =)

Et oui ça a marché sur la socket :lol3:

Merci.
Cette histoire est entièrement vraie puisque je l'ai inventé du début à la fin !

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 15 invités

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite