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



我相信 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, "%sn%d %dn%dn", magicNum, &width, &height, &maxval);
pixel = malloc(imgSize);                       
for(int i = 0; i <imgSize; i++)
{
pixel.green = pixel[i];  ???? 
pixel.blue = ; 
pixel.red = ; 
}
}

从外观上看,您正在读取PPM文件。

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

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类型执行的操作。

代码完全未经测试。享受调试它的乐趣。

最新更新