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.
bien que cela me semble encore flou. si quelqu'un a un tuto dessus MERCIOrganisation 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.
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é.
merci pour votre aide!
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(); }
Partager