IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

manipulation de fichier jpg


Sujet :

C++

  1. #1
    Membre habitué Avatar de fomazou
    Inscrit en
    Mars 2004
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 220
    Points : 151
    Points
    151
    Par défaut manipulation de fichier jpg
    je veux pouvoir par un programme c/c++ parcourir un fichier jpg en sachant bien ou je me trouve pour pouvoir faire des modifications.
    sur le net la doc est assez rare. j'ai trouvé quelque, mais ça me semble bien compliqué.
    moi ce que je veux c'est pouvoir distinguer les différentes partie d'un fichier jpg et apporter des modification de bit au niveau de la partie image elle.

    voici un peu ce que j'ai trouvé sur les jpg.
    Organisation d’un fichier JEPG.

    Les données de JPEG et de JFIF sont des flots d’octets, stockant toujours des valeurs de 16 bits de mot dans le grand-endian format. Des données de JPEG en général sont stockées comme un flot de bloc, et chaque bloc est identifié par une valeur de marqueur. Les deux premiers octets de chaque flot de JPEG sont le début des valeurs FFh D8h de marqueur de l'image (SOI). Dans un fichier JFIF-conforme il y a un marqueur de JFIF APP0 (application), juste après le SOI, qui comprend les éléments de code de marqueur FFh E0h et les caractères JFIF dans les données de marqueur, comme décrit dans la prochaine section. En plus du segment de marqueur de JFIF, il peut y avoir un ou plusieurs segments facultatifs de marqueur de prolongation de JFIF, suivis des données d'image réelles.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    NOMS	MARQUEUR           DESCRIPTION
    M_SOI 	0xff 0xd8              Début du fichier (magic number)
    M_APP0 	0xff 0xe0             Segment Application.
    ….	….	….	Divers segments suivent...
    M_SOS 	0xff 0xda              Limage commence ici.
    M_EOI  	0xff 0xd9	             Limage prend fin ici. Le fichier aussi.
    bien que cela me semble encore flou. si quelqu'un a un tuto dessus MERCI


    voici un code de test, mais on dirai que le programme ne passe jamais par 0xda qui marque le début de l'image. le code est sensé ouvrir un fichier jpg en lecture le recopier sous un autre noms et modifier le contenu de la partie image(juste pour voir ce que ça donne). normalement un logiciel d'image devrai l'ouvrir sans problème si tout c'est bien passé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    #include <iostream>
    #include <fstream>
    #include <stdio.h>
    #include <ios>
     
    using namespace std;
     
    int main(){
    	char ch;
    	const int t=1;
    	int i;
    	cin>>i;
    	cout.setf(ios_base :: hex ,ios_base :: basefield ); // hexadecimal
    	cout<<i <<endl;
    	ifstream myInfile("p2.jpg", ios::in | ios::binary);
    	if(!myInfile){
    	   	cout<<"Le fichier d'entrée n'existe pas";
    	   	exit(-1);
    	}
    	ofstream myOutfile("d.jpg", ios::out| ios::binary);
    	if(!myOutfile){
    		   	cout<<"Le fichier n'a pas pu être crée";
    		   	exit(-1);
    	}
    	int begin=0;
    	while(1) {
    	    myInfile.read(&ch,t);
    	    cout.setf(ios_base :: hex, ios_base :: basefield );
    	    cout.setf(ios_base :: hex ,ios_base :: basefield ); // hexadecimal
    	    cout <<(short)ch ;// " - "<<ch <<endl;
    	    if((short)ch==0xda) begin=1;
    	    cout.setf(ios_base :: dec);
    	    cout << " - "<<(short)ch <<endl;
    	    if(begin==1)myOutfile.write("1",1);
    	    if(0 == myInfile.gcount()) break; 	   
    	}
    	myInfile.close();
                 myOutfile.close();
     
    }
    merci pour votre aide!
    "le temps c'est le meilleur des médécins, peut être aussi le meilleur des assassins" Bernis-Francine

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Et avec une librairie d'image, genre Magick++?

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char ch;
    // ...
    if((short)ch==0xda)
    Attention, ce test ne peut qu'échouer ! Tu compare une valeur entre -128 et 127 à 218

  4. #4
    Membre habitué Avatar de fomazou
    Inscrit en
    Mars 2004
    Messages
    220
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 220
    Points : 151
    Points
    151
    Par défaut
    AH!
    donc j'étais entrain de tenter de recréer la roue
    Et avec une librairie d'image, genre Magick++?
    ou puis-je la trouver?


    ta raison ce code est mauvais.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char ch;
    // ...
    if((short)ch==0xda)
    j'ai modifié par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char ch;
    // ...
    if((short)ch==(short)0xda)
    il ya tout de même un truc de bizard. je sais que normalement un short c'est sur 1 octet. et un char aussi donc l'affichage doit me donner les valeur comprises entre 0 et 255, mais j'ai plutot des valeur entre 0 et 65535. pourquoi? donc en fait c'est celui ci qui marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char ch;
    // ...
    if((short)ch==(short)0xffda)
    "le temps c'est le meilleur des médécins, peut être aussi le meilleur des assassins" Bernis-Francine

  5. #5
    Membre régulier Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Points : 72
    Points
    72
    Par défaut
    Citation Envoyé par fomazou Voir le message
    AH!
    donc j'étais entrain de tenter de recréer la roue


    ou puis-je la trouver?
    Google est ton ami pour ça...

    Citation Envoyé par fomazou Voir le message
    ta raison ce code est mauvais.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char ch;
    // ...
    if((short)ch==0xda)
    j'ai modifié par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char ch;
    // ...
    if((short)ch==(short)0xda)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( ch == '\xda' )
    Et pourquoi? C'est très simple. Quelquefois, char est "signed", mais autrefois c'est "unsigned". Ca dépend du compilateur, des options, le couleur de ta chemise, etc. En ton cas, c'est signed. Le 0xda est un int, et le compilateur doit convertir ch en int aussi. Si les bits de ch sont 11011010 (c-a-d -38 en signed int8), il deviendra -38 en short et -38 en int par "sign extension", et -38 != 0xda. En revanche, '\xda' est un char comme ch, et il suit les mêmes regles que ch.

    L'autre possibilité est de changer "ch" en "unsigned char", et les conversions n'utiliseront pas le "sign extension".

    Citation Envoyé par fomazou Voir le message
    il ya tout de même un truc de bizard. je sais que normalement un short c'est sur 1 octet.
    Mais non, un short est au moins 16 bits, c-a-d 2 octets.

    Citation Envoyé par fomazou Voir le message
    et un char aussi donc l'affichage doit me donner les valeur comprises entre 0 et 255,
    Mais non. char peut être "signed", et en ce cas, les valeurs seront entre -128 et 127 (pour les chars de 8 bits).

    Citation Envoyé par fomazou Voir le message
    mais j'ai plutot des valeur entre 0 et 65535. pourquoi? donc en fait c'est celui ci qui marche.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char ch;
    // ...
    if((short)ch==(short)0xffda)
    Ca marche parce que ton compilateur te donne des shorts de 16 bits.

  6. #6
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    des bibliothèques de traitement d'images, c'est pas ce qui manque en C++ !
    Une petite recherche sur le forum ?

Discussions similaires

  1. Serveur Web : Manipulation de Fichier JPG ou PNG
    Par Lebas dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 15/04/2014, 15h48
  2. [Rave][Delphi] integration de fichiers JPG
    Par Harry dans le forum Rave
    Réponses: 7
    Dernier message: 28/09/2003, 11h36
  3. Manipulation de fichiers - gestion d'extensions
    Par ulukai dans le forum Linux
    Réponses: 13
    Dernier message: 02/07/2003, 15h28
  4. Problème avec les fichiers .JPG
    Par cprogil dans le forum Langage
    Réponses: 5
    Dernier message: 10/06/2003, 15h44
  5. Réponses: 2
    Dernier message: 18/01/2003, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo