fwrite取决于之前的fwrite失败

时间:2014-11-13 11:40:36

标签: c pointers bitmap fwrite

我遇到了一些我不理解的失败的问题。

在这段代码中,fwrite都失败并给出tmp = 0.

  if ((file = fopen(filenameout, "wb")) != NULL)
  {
    bmpheader->filesz += bmpdib->bmp_bytesz;
    bmpdib->bmp_bytesz *= 2;
    bmpdib->height *= 2;
    tmp = fwrite(bmpheader, sizeof(bmp_header_t), 1, file);
    tmp = fwrite(bmpdib,    sizeof(bmp_dib_t),    1, file);
    tmp = fwrite(bmpdata1,  bmpdib->bmp_bytesz,   1, file);
    tmp = fwrite(bmpdata2,  bmpdib->bmp_bytesz,   1, file);

    fclose(file);
  }
  else
    return 1;

但如果我评论一行代码就行了一切:

      if ((file = fopen(filenameout, "wb")) != NULL)
      {
        bmpheader->filesz += bmpdib->bmp_bytesz;
//        bmpdib->bmp_bytesz *= 2;
        bmpdib->height *= 2;
        tmp = fwrite(bmpheader, sizeof(bmp_header_t), 1, file);
        tmp = fwrite(bmpdib,    sizeof(bmp_dib_t),    1, file);
        tmp = fwrite(bmpdata1,  bmpdib->bmp_bytesz,   1, file);
        tmp = fwrite(bmpdata2,  bmpdib->bmp_bytesz,   1, file);

        fclose(file);
      }
      else
        return 1;

我仔细检查了我的代码中的每一个细节:

  • bmpdata1和bmpdata2包含有效的bmp位图数据,如果单独使用,它们会产生正确的图像。
  • bmpheader和bmpdib是从有效的bmp文件中读取的数据结构,它们在我的代码之前都是不受影响的。
  • 所有文件都以二进制模式打开“rb”表示输入,“wb”表示输出。
  • bmpdata1和bmpdata2是同一图像的副本,因此它们的字节大小相同。

我的代码的目标是编写一个图像加上它的修改后的副本,以获得比原始图像高两倍的最终图像。原始位图是570 x 363 x 24位bmp图像。

我做错了什么?

非常感谢任何帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

这解决了这个问题。感谢Art。

  if ((file = fopen(filenameout, "wb")) != NULL)
  {
    bmpheader->filesz += bmpdib->bmp_bytesz;
    bmpdib->bmp_bytesz *= 2;
    bmpdib->height *= 2;
    tmp = fwrite(bmpheader, sizeof(bmp_header_t),   1, file);
    tmp = fwrite(bmpdib,    sizeof(bmp_dib_t),      1, file);
    tmp = fwrite(bmpdata1,  bmpdib->bmp_bytesz / 2, 1, file);
    tmp = fwrite(bmpdata2,  bmpdib->bmp_bytesz / 2, 1, file);

    fclose(file);
  }
  else
    return 1;

我错误地使用更新的位图数据大小来写入最终图像的每个部分。生成的图像有两倍的高度,因为它由两个堆叠的图像组成,每个图像在一个单独的“fwrite”操作中写入,每个操作的结果位图数据大小都是一半。