Necesito leer un archivo PPM y almacenarlo en una matriz escrita en C. ¿Alguien puede ayudarme a hacer esto?lee el archivo PPM y lo almacena en una matriz; codificado con C
Muchas gracias.
Necesito leer un archivo PPM y almacenarlo en una matriz escrita en C. ¿Alguien puede ayudarme a hacer esto?lee el archivo PPM y lo almacena en una matriz; codificado con C
Muchas gracias.
Aquí está el PPM specification.
El archivo PPM está construido en 9 secciones separadas por espacios en blanco.
P6
. Luego omita otros espacios en blanco.Creo que necesita aclarar qué está pasando en esta respuesta, no está muy claro. –
Esto fallará en muchos archivos PNM ya que no tiene en cuenta las líneas de comentarios. – deegee
El siguiente código de muestra cómo leer, cambiar el color del píxel y escribir una imagen en formato PPM. Espero que ayude.
#include<stdio.h>
#include<stdlib.h>
typedef struct {
unsigned char red,green,blue;
} PPMPixel;
typedef struct {
int x, y;
PPMPixel *data;
} PPMImage;
#define CREATOR "RPFELGUEIRAS"
#define RGB_COMPONENT_COLOR 255
static PPMImage *readPPM(const char *filename)
{
char buff[16];
PPMImage *img;
FILE *fp;
int c, rgb_comp_color;
//open PPM file for reading
fp = fopen(filename, "rb");
if (!fp) {
fprintf(stderr, "Unable to open file '%s'\n", filename);
exit(1);
}
//read image format
if (!fgets(buff, sizeof(buff), fp)) {
perror(filename);
exit(1);
}
//check the image format
if (buff[0] != 'P' || buff[1] != '6') {
fprintf(stderr, "Invalid image format (must be 'P6')\n");
exit(1);
}
//alloc memory form image
img = (PPMImage *)malloc(sizeof(PPMImage));
if (!img) {
fprintf(stderr, "Unable to allocate memory\n");
exit(1);
}
//check for comments
c = getc(fp);
while (c == '#') {
while (getc(fp) != '\n') ;
c = getc(fp);
}
ungetc(c, fp);
//read image size information
if (fscanf(fp, "%d %d", &img->x, &img->y) != 2) {
fprintf(stderr, "Invalid image size (error loading '%s')\n", filename);
exit(1);
}
//read rgb component
if (fscanf(fp, "%d", &rgb_comp_color) != 1) {
fprintf(stderr, "Invalid rgb component (error loading '%s')\n", filename);
exit(1);
}
//check rgb component depth
if (rgb_comp_color!= RGB_COMPONENT_COLOR) {
fprintf(stderr, "'%s' does not have 8-bits components\n", filename);
exit(1);
}
while (fgetc(fp) != '\n') ;
//memory allocation for pixel data
img->data = (PPMPixel*)malloc(img->x * img->y * sizeof(PPMPixel));
if (!img) {
fprintf(stderr, "Unable to allocate memory\n");
exit(1);
}
//read pixel data from file
if (fread(img->data, 3 * img->x, img->y, fp) != img->y) {
fprintf(stderr, "Error loading image '%s'\n", filename);
exit(1);
}
fclose(fp);
return img;
}
void writePPM(const char *filename, PPMImage *img)
{
FILE *fp;
//open file for output
fp = fopen(filename, "wb");
if (!fp) {
fprintf(stderr, "Unable to open file '%s'\n", filename);
exit(1);
}
//write the header file
//image format
fprintf(fp, "P6\n");
//comments
fprintf(fp, "# Created by %s\n",CREATOR);
//image size
fprintf(fp, "%d %d\n",img->x,img->y);
// rgb component depth
fprintf(fp, "%d\n",RGB_COMPONENT_COLOR);
// pixel data
fwrite(img->data, 3 * img->x, img->y, fp);
fclose(fp);
}
void changeColorPPM(PPMImage *img)
{
int i;
if(img){
for(i=0;i<img->x*img->y;i++){
img->data[i].red=RGB_COMPONENT_COLOR-img->data[i].red;
img->data[i].green=RGB_COMPONENT_COLOR-img->data[i].green;
img->data[i].blue=RGB_COMPONENT_COLOR-img->data[i].blue;
}
}
}
int main(){
PPMImage *image;
image = readPPM("can_bottom.ppm");
changeColorPPM(image);
writePPM("can_bottom2.ppm",image);
printf("Press any key...");
getchar();
}
Este código fallará en muchos archivos PNM porque PNM usa espacios en blanco entre las entradas del encabezado y no está fijado para usar solo LF. Una línea de comentarios también se puede ubicar casi en cualquier parte del encabezado y es técnicamente la única línea que debe terminarse con un CR o LF. El diseño de formato de archivo binario PNM es un desastre roto. Sourceforge netpbm incluso establece que la inclusión de un comentario, aunque es un objeto de encabezado válido, esencialmente rompe el formato del archivo. – deegee
tiene mallocs, ¿por qué no hay liberaciones? – imre
¿Qué parte estás teniendo problemas con? Si publica su intento de hacerlo, eso no está funcionando bien, será bastante fácil encontrar los errores. – caf