我正在制作一个用C语言创建位图文件的程序。它使用的是24位颜色。
我正在分三个阶段编写文件,首先编写FileHeader,然后编写InfoHeader,然后编写像素数据。我在填充像素数据时遇到问题,因此每行都在字边界上完成。
下面的代码有时是,但只有没有while循环(将填充添加到行尾)。例如,对于12x12px图像,我可以将其缩放到24x24,但不能缩放到10x10(文件已损坏)。当我输入下面的填充代码时,图像会变形,有时也会被破坏。
我似乎无法弄清楚出了什么问题,下面的代码应该在每行的末尾添加填充,直到我遇到一个单词边界,然后开始下一行。
fwrite(&fh, 1, sizeof(FILEHEADER), n_img);
fwrite(&ih, 1, sizeof(INFOHEADER), n_img);
int i, j;
uint8_t pad = 0;
for (i = height-1; i >= 0; i--) {
for (j = 0; j < width; j++)
fwrite(n_pix+(i*width)+j, 1, sizeof(IMAGE), n_img);
while(ftell(n_img)%4 != 0)
fwrite(&pad, 1, 1, n_img);
}
答案 0 :(得分:4)
您没有将行填充到字大小,而是填充当前文件位置。它不起作用,因为标题的大小加起来为54 - 而不是4的倍数。
不使用ftell来检索“当前位置”,而是使用数学。将pad
设为无符号长整数,并在循环之前插入:
int npad = (sizeof(IMAGE)*width) & 3;
if (npad)
npad = 4-npad;
然后,代替while(ftell ..
循环,立即写出所需的字节数:
fwrite (&pad, 1,npad, n_img);
npad
的范围是0..3,这就是为什么你必须使pad
成为一个4字节的整数。