Ouverture de fichier image incorrecte - C - Programmation
Marsh Posté le 12-12-2004 à 22:38:10
Chandy a écrit : Salut à tous ! |
Le caractère '\0' est utilisée comme valeur spéciale dans les chaînes de caractères pour signifier "fin de chaîne".
Cette valeur est une "convention" ce qui veut dire que les fonctions de manipulations de chaînes cherchent cette valeur lorsqu'elles balayent les chaînes.
Les fonctions de lecture de fichier (fread, fgetc, fgets, fscanf) ne sont pas des fonctions de manipulation de chaîne. Elles ne font pas attention au caractère '\0' quand elles le chopent.
Le seul soucis qui puisse arriver quand tu manipule un fichier binaire dans le monde "windows" c'est que tu aies oublié de spécifier, dans ta fonction "fopen", d'ouvrir le fichier en mode "binaire".
Au lieu de faire un fopen(fichier, "r" ) faut écrire fopen(fichier, "rb" ). Sinon ton fichier est considéré comme un fichier texte.
Marsh Posté le 13-12-2004 à 10:08:56
Chandy a écrit : Le problème est que ce fichier étant en binaire, les couleurs sont représentées par un caractère entre 0 et 255, or la lecture d'un "0" fait arrêter la lecture du fichier <...> |
A part que l'ouverture doit être faite en mode binaire ("rb" ), je ne vois pas ce qui pourrait emp^écher la lecture jusqu'au bout. Montre ton code.
Marsh Posté le 13-12-2004 à 10:42:28
Tu serais pas en train de bloquer la lecture à l'arrivée d'un octet 0 au lieu de tester EOF ?
Marsh Posté le 13-12-2004 à 11:53:37
Emmanuel Delahaye a écrit : A part que l'ouverture doit être faite en mode binaire ("rb" ), je ne vois pas ce qui pourrait emp^écher la lecture jusqu'au bout. Montre ton code. |
Voilà le code brut
Citation : typedef struct { |
Et l'image que je charge commence avec une série de points complètement noirs ( 0 donc ), et le pointeur data pointe sur une zone de taille 0, alors que quand je charge une image sans valeur '0', c'est correctement rempli.
Merci pour toutes vos réponses
a++
Marsh Posté le 13-12-2004 à 12:13:25
Chandy a écrit : Voilà le code brut |
Tu l'aurais en 'compilable', ou il faut que je me tape un demi-heure de rétroingéniérie?
Compiling MAIN.C: |
Marsh Posté le 13-12-2004 à 12:17:35
Ouep bien sur, voilà
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <GL/glut.h>
typedef struct {
int sizeX, sizeY;
GLubyte *data;
} PPMImage;
static PPMImage *LoadPPM(const char *filename)
{
char buff[16];
PPMImage *result;
FILE *fp;
int maxval,lig_comm=0;
fp = fopen(filename, "rb" );
if (!fp)
{
fprintf(stderr, "Unable to open file `%s'\n", filename);
exit(1);
}
if (fread(buff, 1, 3, fp)!=3)
{
perror(filename);
exit(1);
}
/*if (buff[0] != 'P' || buff[1] != '6')
{
fprintf(stderr, "Invalid image format (must be `P6')\n" );
exit(1);
}
*/
if (buff[2] != 0x0a)
fseek(fp,-1,SEEK_CUR);
while (fgetc(fp) == '#'){
lig_comm++;
while (fgetc(fp) != '\n')
;
}
fseek(fp,-1,SEEK_CUR);
result = (PPMImage *)malloc(sizeof(PPMImage));
if (!result)
{
fprintf(stderr, "Unable to allocate memory\n" );
exit(1);
}
if (fscanf(fp, "%d %d", &result->sizeX, &result->sizeY) != 2)
{
fprintf(stderr, "Error loading image `%s'\n", filename);
exit(1);
}
if (fscanf(fp, "%d", &maxval) != 1)
{
fprintf(stderr, "Error loading image `%s'\n", filename);
exit(1);
}
while (fgetc(fp) != '\n')
;
result->data = (GLubyte *)malloc(3 * result->sizeX * result->sizeY);
if (!result)
{
fprintf(stderr, "Unable to allocate memory\n" );
exit(1);
}
if (fread(result->data, 3 * result->sizeX, result->sizeY, fp) != result->sizeY)
{
fprintf(stderr, "Error loading image `%s'\n", filename);
exit(1);
}
fclose(fp);
return result;
}
int main ( void )
{
PPMImage *neb;
int i;
neb = LoadPPM("./bump_binary.ppm" );
printf("H : %d, L %d, nb %d\n",neb->sizeY, neb->sizeX, strlen(neb->data));
for ( i=0;i<strlen(neb->data)-4;i++) ;
printf("%c",neb->data[i]);
printf("FINI\n" );
}
ca devrait compiler
EDIT : l'include du Glut est pas necessaire
Marsh Posté le 13-12-2004 à 13:14:26
Chandy a écrit : Ouep bien sur, voilà
|
On va se débrouiller... Essaye d'utiliser les boutons [C/C++] ou [Fixed] pour encadrer le code...
Citation :
|
Il faudrait donner un lien html vers ce fichier
Marsh Posté le 13-12-2004 à 13:52:14
Voilà le lien sur l'image
Il faut juste la recréer en .ppm, sinon imageshack la prend pas ... ( Irfanview ou Paint le font très bien )
http://img112.exs.cx/img112/2232/bump5fn.png
EDIT: je viens de réessayer en mettant en blanc quelques pixels tout en haut à gauche ( peu importe le nombre), et la taille du data est bien le nombre de pixels blancs*3 ( car RVB ).
Bref, c'est bien la lecture d'un pixel noir qui pose pb
Marsh Posté le 12-12-2004 à 22:04:56
Salut à tous !
J'ai un problème avec un programme C, je dois ouvrir un fichier image au format ppm ( du bmp avec une entête ).
Le problème est que ce fichier étant en binaire, les couleurs sont représentées par un caractère entre 0 et 255, or la lecture d'un "0" fait arrêter la lecture du fichier image, vu que c'est en fait '\0'.
Quelqu'un a une idée pour parvenir à lire tout de même le fichier image jusqu'à la fin ?