我认为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 = ;
}
}
答案 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
类型的意图。
代码完全未经测试。好好调试它。