Я новичок в программировании C и я экспериментировал с манипуляцией файл, я пытаюсь вывести файл PPM с его комментариями и значения RGB данных следующим образом:C Дисплей PPM изображение Текст
P3
# The same image with width 3 and height 2,
# using 0 or 1 per color (red, green, blue)
3 2 1
1 0 0 0 1 0 0 0 1
1 1 0 1 1 1 0 0 0
В этом программе я смог проверить, что он имеет правильный формат и читается в struct, но где я застрял - как собрать данные rgb, а затем распечатать его. Вот что я до сих пор. Метод для отображения этой информации - это структура showPPM, которую я начал, но не знаю, как читать структуру изображения и собирать ее значения rgb и отображать ее, любая помощь будет отличной.
#include<stdio.h>
#include<stdlib.h>
typedef struct {
unsigned char red,green,blue;
} PPMPixel;
typedef struct {
int x, y;
PPMPixel *data;
} PPMImage;
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] != '3') {
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);
}
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 showPPM(struct * image){
int rgb_array[600][400];
int i;
int j;
for(i = 0; i<600; i++)
{
for(j = 0; j<400; j++)
{
printf("%d", rgb_array[i][j]);
}
}
}
int main(){
PPMImage *image;
image = readPPM("aab.ppm");
showPPM(image);
}
Ваш вопрос не достаточно конкретный. «Не знаю, куда идти», это не вопрос. Что конкретно вы не понимаете? Во-первых, почему бы вам хотя бы не попытаться получить доступ к 'image', который был передан в функцию' showPPM'? Этот 'image' содержит структуру, которая имеет массив' data'. Просто перебирайте этот массив и распечатайте то, что вам нужно. – kaylum
Спасибо, изменил мой вопрос, чтобы быть более конкретным, проблема, с которой я сталкиваюсь, - я не знаю, как распечатать структуру изображения, поскольку я не привык к c. –
Что значит не знаете как? Вызовите 'printf'. Если вы не можете задать конкретный вопрос, тогда вам будет трудно помочь. Например, вы имеете в виду, что не знаете, как писать цикл для повторения данных? Или что конкретно? Кроме того, я думаю, что ваша функция readPPM неверна. 'fread (img-> data, 3 * img-> x, img-> y, fp)', который не будет работать. На входе есть пробелы, поэтому '3' байт для каждого пикселя недостаточно. – kaylum