【问题标题】:Padding a Bitmap pixel array填充位图像素数组
【发布时间】:2013-08-05 06:12:22
【问题描述】:

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

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

下面的代码有时可以工作,但只是没有 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);
}

【问题讨论】:

  • 所以你不打算把它变成一个像素的正方形,而只是在单词边界上完成每一行?

标签: c image bitmap bmp image-scaling


【解决方案1】:

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

【讨论】:

  • 哦,那么我应该相对于像素数据的开头而不是相对于文件的开头进行填充?
  • 是的,根据“计算表面步幅”下的Microsoft Reference
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 2018-06-10
  • 2011-06-20
  • 2016-05-30
  • 1970-01-01
  • 2016-09-16
相关资源
最近更新 更多