写入C中的bmp文件

时间:2014-12-10 12:25:43

标签: c fwrite bmp

写入bmp文件时遇到困难。 以下是分配矩阵的代码:

  // Dynamically allocate matrix for the bitmap and 
  // while doing so, color it in blue.
  Pixel **bmp_matrix = (Pixel**)malloc(config.resolution_height_ * 
                                       sizeof(Pixel*));
  if (bmp_matrix == NULL)
  {
    printf("error: out of memory\n");
    return MEMORY_ERROR;
  }
  int rows = 0;
  for(; rows < config.resolution_height_; rows++)
  {
    bmp_matrix[rows] = (Pixel*)malloc(config.resolution_width_ * 
                                      sizeof(Pixel));
    if (bmp_matrix[rows] == NULL)
    {
      while(--rows >= 0)
        free(bmp_matrix[rows]);
      free(bmp_matrix);
      printf("error: out of memory\n");
      return MEMORY_ERROR;
    }
    int columns = 0;
    for(; columns < config.resolution_width_; columns++)
      {
        bmp_matrix[rows][columns].red_ = 175;
        bmp_matrix[rows][columns].green_ = 175;
        bmp_matrix[rows][columns].blue_ = 255;
      }
  }

以下是编写像素的代码:

int height, width, pad_iterator;
  for(height = info_header.height_ - 1; height >= 0; height--)
  {
    // for(width = 0; width < info_header.width_; width++)
    //   fwrite(&bmp_matrix[height][width], sizeof(Pixel), 1, bitmap_file);
    fwrite(&bmp_matrix[height], sizeof(Pixel), info_header.width_, bitmap_file);
    for(pad_iterator = 0; pad_iterator < pad_length; pad_iterator++)
      fwrite(&pad, sizeof(Byte), 1, bitmap_file);
  }

现在,当我使用被评论的for循环时,一切都很完美。生成的图像没问题。 但是,我试图用一个fwrite替换它,所以程序不必迭代循环。 在这种情况下,生成的图像是完全错误的。

任何帮助?

1 个答案:

答案 0 :(得分:1)

你的第二次尝试是不正确的。

在评论的写作(fwrite(&bmp_matrix[height][width], sizeof(Pixel), 1, bitmap_file);)中,您在地址&bmp_matrix[height][width]使用一个正确的像素。

但是在fwrite(&bmp_matrix[height], sizeof(Pixel), info_header.width_, bitmap_file);中,您从地址&bmp_matrix[height]中写入字节...根据bmp_matrix

的实际声明,可能会有不同的内容

你应该使用&bmp_matrix[height][0] ie。一行中的第一个像素的地址或等效(如Peter Schneider所建议的)bmp_matrix[height](没有&)都给出正确的地址。