了解fread()以存储rgb像素值

时间:2018-05-07 17:56:59

标签: c pointers fread

我认为for循环应该用fread代替,但是,我很清楚fread将如何工作。

fread如何知道绿色像素@给定位置的值以及保存值的位置。我的理解是我有一大堆堆内存,一个矩形有一个像素数的tbd。每个像素有3个值。如何(或我可以使用的任何其他方法)?

如果有人能解释下面的fread行如何与我的代码一起使用?这是一个作业,我只是想了解发生了什么,因为它是我们将要建立的。

fread(pixelD, sizeof(Pixel), width*height, file);

typdef struct
{       
        unsigned char green;
        unsigned char blue;
        unsigned char red;
}pixelD;

typedef struct
{       
        pixelD * pixel;
} Color;

Image * ReadImage(char *filename)
{
  int width, height, maxval;
  int imgSize = width * height * sizeof(pixel); 

  //fscanf line was given by prof 
  fscanf(f_in, "%s\n%d %d\n%d\n", magicNum, &width, &height, &maxval);
  pixel = malloc(imgSize);                       
  for(int i = 0; i <imgSize; i++)
  {
     pixel.green = pixel[i];  ???? 
     pixel.blue = ; 
     pixel.red = ; 
  }
}

1 个答案:

答案 0 :(得分:1)

从它的外观来看,你正在阅读PPM file

阅读标题,执行以下操作:

int width, height, max;
my_assert(3==fscanf(f_in, "P6%d%d%d ", &width, &height, &max));
/* TODO: error handling */

格式说明符告诉它读取预期的幻数(“P6”),然后读取第二,第三和第四个单词作为整数(隐式跳过它们之间的任何空格),然后消耗一个空格(根据PPM,“主要是换行符”) )将文件读取位置设置为二进制数据开始的位置。您应该确保宽度/高度/最大值在您的应用程序期望的范围内并且可以应对。

然后将剩余的数据读入内存。 fread从当前读取位置size*count字节读取;没有格式化:

int channel_width = max < 256 ? 1 : 2; /* PPM channel width can be either 1- or 2-byte */
int rgb = 3;
int imgsize = width*height*rgb*channel_width;
void* texture = malloc(imgsize);
my_assert(imgsize==fread(texture, 1, imgsize, f_in));
/* do something with the texture memory */

此时,您可以将纹理指针强制转换为您要使用的任何结构,例如pixel1D* pixs = texture(如果通道长度为2个字节,请注意,因为发布的结构不是)。我发现一个携带元和无类型内存块的结构更灵活,因为大部分都使用OpenGL。也许这就是你对Image类型的意图。

代码完全未经测试。好好调试它。