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 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
#include <string.h>
#include "image.h"
void extractPix(unsigned char* imgbuffer, int hauteur, int largeur, int num)
{
printf("Debut traitement\n");
/** GL: pourquoi utiliser une allocation dynamique de longueur fixe et courte ?
nom_image[17] = ""; aurait tout aussi bien convenu */
char* nom_image = NULL;
int longueur = 17;
nom_image = malloc(longueur);
if (nom_image == NULL) {
perror("Erreur sur malloc");
exit(EXIT_FAILURE);
}
memset(nom_image, '\0', sizeof(nom_image));
snprintf(nom_image, longueur, "Image_%.05d.ppm", num);
printf("nom_image = '%s'\n",nom_image);
/** GL: meme remarque que precedement, imgbuffer n'est pas, d'apres tes explications, une chaine de caracteres. strlen n'est pas adapte (d'autant que tu connais la largeur et hauteur de l'image ainsi que le codage, tu peux donc recalculer la taille. */
size_t longueur_streaming= ((unsigned)strlen(imgbuffer));
printf("taille: %d\n",longueur_streaming);
/** GL: les VLA sont une nouveaute C99 et pas fonctionnelle a 100% sur tout les compilateurs.
En outre si il est impossible de reserve assez de memoire, il n'y a aucun retour de l'indiquant, et on va donc dans le mur (peut etre ce qui t'arrive d'ailleurs.
Autant passer par l'allocation dynamique */
unsigned char Y[4*longueur_streaming/6];
unsigned char U[longueur_streaming/6];
unsigned char V[longueur_streaming/6];
/** GL: pour un index de tableau, c'est size_t pas int */
int i;
for(i=0; i<4*longueur_streaming/6; i++){
printf("i: %d\n",i);
Y[i]=imgbuffer[i];
}
for(i=4*longueur_streaming/6; i<5*longueur_streaming/6; i++){
U[i-4*longueur_streaming/6]=imgbuffer[i];
}
for(i=5*longueur_streaming/6; i<longueur_streaming; i++)
{
V[i-(5*longueur_streaming/6)]=imgbuffer[i];
}
/** GL: il n'y a nul par dans cette fonction d'allocation de imgbuffer. Es-tu crertain qu'il s'agit bien d'une allocation dynamique et non d'un tableau statique ? */
free(imgbuffer);
printf("En cours d'ecriture de l'image...\n");
fp = fopen(nom_image, "w");
free(nom_image); nom_image = NULL;
if(fp==NULL)
{
printf("Impossible d'ouvrir le fichier\n");
/** GL: pourquoi -1 ? */
exit(-1);
}
fprintf(fp, "P6\n%d %d\n255\n",largeur, hauteur);
/** GL : d'ou sortent les variable p, j, jDebut, y, u, v, r, g et b ?
De quel type sont-elles ?*/
p=0;
jDebut=0;
j = jDebut;
for(ligne=0;ligne<hauteur;ligne++)
{
if(ligne%2!=0)
j=jDebut;
else
jDebut=j;
for(colonne=0;colonne<largeur;colonne++)
{
y = Y[p]; p++;
u = U[j];
v = V[j];
r=2*y+u+v;
g=-0.396*u+2.029*v;
b= 1.14*y-0.581*u;
putc(r, fp);
putc(g, fp);
putc(b, fp);
if(colonne%2==0)
j++;
}
}
printf("Image écrite...\n");
fflush(fp);
fclose(fp);
} |