0

好的,所以我的代码将从 ppm 图像的标题中读取,为图像的大小分配内存,并为每个像素成功打印空白点(终端中重复的随机数)。我只需要知道我应该如何读取每个像素的红色绿色和蓝色值(3 个不同的值,范围从 0-255)。我不知道如何在每个像素中访问这些数据。到目前为止,这是我的代码:

#include <stdio.h>
#include <stdlib.h>

int subscript(int row,int column,int numberColumns);
int sub(int rd, int gr, int bl);
//table of contents for the subscript
int main(void){
        char header[5];
        scanf("%s",header);
        printf("%s",header);
        printf("\n");
        int width, height, depth;
        scanf("%d %d %d\n", &width, &height, &depth);
        printf("%d %d %d\n", width, height, depth);
        int red = 0;
        int green = 0;
        int blue = 0;
        int sm;
        int r = 0;
        int c = 0;
        //allocate memory for bit to be used throughout main
        unsigned char *bit = malloc(width*height);
        int *rgb = malloc(3*depth);
        //loops to read in table and print it
        while(r < height){
                while(c < width)
                        {
                        int col;
                        scanf("%d",&col);
                        //brings in allocated memory and values
                        bit[subscript(r,c,width)] = col;
                        int clr;
                        rgb[sub(red,green,blue)] = clr; 
                        int color = clr + col;
                        printf(" %d",clr);
                        c=c+1;
                        }
                printf("\n");
                r = r + 1;
                c = 0;
                }


        free(bit);

}
int subscript(int row,int column, int numberColumns)
        {
        return row * numberColumns + column;
        //retuns items for subscript
}

int sub(int rd, int gr, int bl)
        {
        return rd+gr+bl;
}
4

1 回答 1

0

如果标头中的最大颜色值字段小于 256,则PPM 文件将颜色存储为字节的三倍(r、g 和 b 按顺序各一个字节);如果标头中的最大颜色值字段小于 256,则 PPM 文件将颜色存储为两个字节的三倍(因此两个字节) r、g 和 b 中的每一个的字节,再次按此顺序)。

在每个通道两个字节的情况下,字节是 MSB 在前(大端)。


scanf("%c", &byte_var);会将您读入一个字符(字节)byte_var,这应该是适当的类型。然后,您可以相应地处理它。scanf("%hhu", &byte_var);如果您使用 C99,将读取一个无符号字符 - 如果您使用 C89,您应该查找getchar

现在,scanf返回成功转换的参数或 EOF 的数量,因此您应该检查不正确输入和输入结尾的结果。例如:

int n;
char c;

while ((n = scanf("%c", &c)) != EOF && 1 == n) {
    // do something
}

一个例子是:

// Read width, height, work out how many bytes you need per pixel.
...

// Now read some pixels
// Here I assume one byte per pixel; this would be a good situation
// to use a function for reading different channel widths

w = 0, h = 0;
while ((n = scanf("%hhu%hhu%hhu", &r, &g, &b)) != EOF && 3 == n
        && w < width && h < height) {
  // now do something with r, g, b
  // e.g. store them in an appropriate pixels array at pixels[w][h] 
  ...

  ++w;
  if (w == width) {
    w = 0, ++h;
  }
}

我还看到您正在阅读stdin,我发现这有点不寻常,因为标题表明您正在使用文件。fopen您可以使用(不要忘记检查结果)打开一个文件,使用fscanf读取它,然后使用fclose关闭它。

但是,我建议将整个文件读入内存并在那里处理,因为一次读取几个字节的文件很慢。


最后,我注意到您只是在需要* * *时分配width*height字节,而不是检查您是否失败,而不是 freeing 。你应该解决这些问题。bitbytes_per_channelnum_channelswidthheightmallocrgb

于 2014-11-29T02:29:33.103 回答