如何在c中读取图像的像素?

时间:2019-02-08 23:08:02

标签: c

  

假设我们的位图图像的高度为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++) {

        }

1 个答案:

答案 0 :(得分:1)

由于要分配2D数组,因此首先需要分配struct pixel *的数组:

struct pixel **ptrs = malloc(height * sizeof(struct pixel*));

这里要注意一些变化:

  1. 您正在分配指向struct pixel而不是unsigned char的指针。
  2. malloc()返回一个指针。将指针乘以整数是无效的。
  3. 乘法放在括号中,因为它有助于计算要分配的正确字节数。

接下来,您需要为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);