假设我们的位图图像的高度为M,宽度为N。 在本实验中,宽度N为4的倍数,这简化了 文件中的字节布局。对于此图像,像素阵列存储 正好3 x N x M字节,方法如下:
每组3个字节代表一个像素,字节存储在其中 像素的蓝色,绿色和红色颜色值,按此顺序。
像素按行分组。例如, 像素阵列代表图像最顶部一行中的像素。
pixel_array_offset
是像素阵列的起始位置。
结构像素如下:
struct pixel {
unsigned char blue;
unsigned char green;
unsigned char red;
};
这是实现功能的要求:
/*
* Read in pixel array by following these instructions:
*
* 1. First, allocate space for m "struct pixel *" values, where m is the
* height of the image. Each pointer will eventually point to one row of
* pixel data.
* 2. For each pointer you just allocated, initialize it to point to
* heap-allocated space for an entire row of pixel data.
* 3. ...
* 4. ...
*/
struct pixel **read_pixel_array(FILE *image, int pixel_array_offset, int width, int height) {
}
第一步,为m个“结构像素*”值分配空间。我认为它实际上是在为像素值数组分配空间。所以我把
unsigned char **ptrs = height * malloc(sizeof(struct pixel));
第二步,我不太了解该怎么做。我想我需要一个for循环来为像素数据的所有行分配空间。但是我不知道该放什么。
for (int i=0, i<height, i++) {
}
答案 0 :(得分:1)
由于要分配2D数组,因此首先需要分配struct pixel *
的数组:
struct pixel **ptrs = malloc(height * sizeof(struct pixel*));
这里要注意一些变化:
struct pixel
而不是unsigned char
的指针。 malloc()
返回一个指针。将指针乘以整数是无效的。接下来,您需要为2D数组中的每一行分配一个struct pixel
数组:
for (int i=0, i<height, i++) {
ptrs[i] = malloc(width * sizeof(struct pixel));
}
现在,数组已完全分配,您可以用数据填充它:
ptrs[5][6] = { 255, 0, 0}; // a blue pixel
最后记得在退出程序之前free()
使用所有指针:
for (int i=0, i<height, i++) {
free(ptrs[i]);
}
free(ptrs);