我对某些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图像。
我究竟做错了什么?
非常感谢您的任何帮助。
最佳答案
这样就解决了问题。感谢艺术。
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”操作写入的,每个图像的位图数据大小只有一半。
关于c - fwrite失败取决于先前的fwrite,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26908086/