bonjour, j'ai quelques bases de C et je désirerrais concevoir un petit programme qui stocke les valeurs des pixels dans un tableau deux dimention (le bmp est monochrome donc 1 bit par pixel).
j'ai trouvé divers fonctions permettant d'ouvrir un fichier en binaire, de me positionner à l'interieur et de lire des octets. j'ai ensuite décomposé les octets lus en bit pour les rentrer dans un tableau.
lors de la restution (pour tester si le tableau est bien capturé), l'entête est recopiée à partir du fichier de base "typon.bmp" dans le fichier "contour.bmp"
ensuite le tableau est lu, puis au bout de 8 elements lu, un octet est créé et est écrit dans le fichier.
voila le code!
le code n'est peut être pas très clair...#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define source "typon.bmp"
#define dest "contour.bmp"
/****************************** *prototype de fonctions********************* *****/
int main(void);
void tableau(void);
/****************************** ***declaration variables********************* ****/
int bmp[10000][10000];
int B[8];
int envoie[8];
int value, octet;
short int plan, bitparpixel;
char ecrit;
unsigned int offset, largeur, hauteur, compression, echellex, echelley, j, i, k, x, y;
FILE * fichier1=NULL, * fichier2=NULL;
/****************************** *******main******************* *******************/
int main()
{
fichier1 = fopen(source, "rb");
if (fichier1 == NULL)
{
printf("impossible d'ouvrir\n");
system("pause");
return 0;
exit(EXIT_FAILURE);
}
printf("Fichier ouvert\n");
fseek(fichier1, 10, SEEK_SET);
fread(&offset, sizeof(long), 1, fichier1);
printf("offset : %d\n",offset);
fseek(fichier1, 18, SEEK_SET);
fread(&largeur, sizeof(long), 1, fichier1);
printf("largeur : %d\n", largeur);
fread(&hauteur, sizeof(long), 1, fichier1);
printf("hauteur : %d\n", hauteur);
fread(&plan, sizeof(short), 1, fichier1);
printf("plan : %d\n", plan);
fread(&bitparpixel, sizeof(short), 1, fichier1);
printf("bit(s) par pixel : %d\n", bitparpixel);
fread(&compression, sizeof(long), 1, fichier1);
printf("compression (0 si pas de compression) : %d\n", compression);
fseek(fichier1, 38, SEEK_SET);
fread(&echellex, sizeof(long), 1, fichier1);
printf("echelle x : %d\n", echellex);
fread(&echelley, sizeof(long), 1, fichier1);
printf("echelle y : %d\n", echelley);
if (echellex==0) printf("echelle des x inconnue\n");
if (echelley==0) printf("echelle des y inconnue\n"); // recupère les données du fichier1
fichier2 = fopen(dest, "wb");
if (fichier2 == NULL)
{
printf("impossible de creer\n");
system("pause");
return 0;
}
fseek(fichier1, 0, SEEK_SET);
for (i=0;i<offset;i++)
{
fread(&ecrit, sizeof(char), 1, fichier1);
fprintf(fichier2,"%c",ecrit,fi chier2);
}
printf("entête recopiée\n"); // recopie l'entête du fichier1 dans le fichier2
tableau();
printf("tableau chargé\n");
system("pause");
for (i=0; i<hauteur;i++){ //recopie tableau
for(k=0;k<largeur;k++){
envoie[(i*largeur+k)%8]=bmp[k][i];
if (((i*largeur+k)%8)==7){
ecrit=envoie[0]*128+envoie[1]*64+envoie[2]*32+envoie[3]*16+envoie[4]*8+envoie[5]*4+envoie[6]*2+envoie[7];
fprintf(fichier2,"%c",ecrit);
}
}}
fclose(fichier1);
fclose(fichier2); // fermeture des fichier
printf("\n\nidentification de contour reussi! resultat exporté dans contour.bmp\n\n");
system("pause");
return 0;
}
/****************************** ***** tableau*********************** *************/
void tableau()
{
fseek(fichier1, offset, SEEK_SET);
x=0;
y=0;
for (i=0;i<(hauteur*largeur);i++)
{
if ((x+y*largeur)%8==0)
{
fread(&octet, sizeof(unsigned char), 1, fichier1);
value=0;
B[0]=0;
B[1]=0;
B[2]=0;
B[3]=0;
B[4]=0;
B[5]=0;
B[6]=0;
if (octet-(128+value)>0) { B[0]=1;value=value+128;}
if (octet-(64+value)>0) { B[1]=1;value=value+64;}
if (octet-(32+value)>0) { B[2]=1;value=value+32;}
if (octet-(16+value)>0) { B[3]=1;value=value+16;}
if (octet-(8+value)>0 ) { B[4]=1;value=value+8;}
if (octet-(4+value)>0 ) { B[5]=1;value=value+4;}
if (octet-(2+value)>0 ) { B[6]=1;value=value+2;}
if (octet-(1+value)>0 ) { B[7]=1;value=value+1;} // decomposition de l'octet lu
}
bmp[x][y]=B[(int)(x+y*largeur)%8]; // remplissage du tableau
x++;
if (x==largeur){y++;x=0;}; //on passe à la ligne suivante arrivé en bout de ligne
}
}
le tout étant que le programme se compile, capture l'entête et l'affiche sans problème, recopie l'entête du fichier, mais lors de la recopie du fichier, le nouveau ("contour.bmp") est plus petit et en l'ouvrant avec pain, on voit plein de trait. on distingue le fichier de départ, mais déformé.
je joins ces deux fichiers.
j'utilise dev c++ comme programme, mais je suis obligé d'enregistrer mon fichier en *.cpp et de le compiler sinon le programme n'arrive pas à le compiler... c'est peut être la cause de mon problème... mais j'ai déjas fait d'autres petits programme et tout fonctionnait bien donc...
merci de me dire pourquoi cela ne fonctionne pas, si quelqu'un trouve... j'ai essayé plusieurs choses mais je n'ai pas encore trouvé si cela vien de la copie dans le tableau ou de la restitution...
Merci d'avance
Olivier
Pour poster des images de ce type le format gif est bien mieux adapté : aucune perte de qualité et poids bien plus faible : voir http://forums.futura-sciences.com/el...ointes-pj.html
JPL, modérateur
-----