填充位图像素arrays

我正在制作一个在C中创建位图文件的程序,它使用的是24位颜色。

我正在分3个阶段编写文件,首先编写FileHeader,然后编写InfoHeader,然后编写像素数据。 我在填充像素数据时遇到问题,因此每行都在字边界上完成。

下面的代码有时会工作 ,但只有没有while循环(它将填充添加到行的末尾)。 例如,对于12×12像素的图像,我可以将其缩放到24×24,但不能缩放到10×10(文件已损坏)。 当我输入下面的填充代码时,图像会变形,有时也会损坏。

我似乎无法弄清楚出了什么问题,下面的代码应该在每行的末尾添加填充,直到我遇到一个单词边界,然后开始下一行。

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); } 

您没有将填充到字大小,而是填充当前文件位置 。 并且它不起作用,因为标题的大小加起来为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字节整数的原因。