You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言手动实现BMP图像Padding时奇数Padding致图像损坏问题

BMP图像添加Padding时奇数Padding导致图像损坏问题

我正在用C语言编写一款小型图像处理程序,目前实现了一个为图像添加Padding的函数。当Padding为偶数时,图像能正常添加环绕式Padding;但当Padding为奇数时,图像会损坏。

实现代码

void _add_padding(struct bmp_image* image, int padding) {
    //construct new images resolution with added padding.
    int new_height = image->header.height + (padding*2);
    int new_width = image->header.width + (padding*2);
    //allocate new image to the memory.
    struct pixel** output_pixels = (struct pixel**)malloc(new_height * sizeof(struct pixel*));

    for (int i = 0; i < new_height; i++) {
        output_pixels[i] = malloc(new_width * sizeof(struct pixel));
    }

    //initialize new image with all zeros.
    int new_colour = 255;
    for (int i = 0; i < new_height; i++) {
        for (int j = 0;j < new_width; j++) {
            output_pixels[i][j].red = new_colour;
            output_pixels[i][j].green = new_colour;
            output_pixels[i][j].blue = new_colour;
        }
    }

    for (int i = padding; i < image->header.height+ padding; i++) {
        for (int j = padding;j < image->header.width + padding; j++) {
            output_pixels[i][j].red=  image->pixels[i-padding][j-padding].red;
            output_pixels[i][j].green = image->pixels[i-padding][j-padding].green;
            output_pixels[i][j].blue = image->pixels[i-padding][j-padding].blue;
        }
    }

    image->header.height = new_height;
    image->header.width = new_width;

    for (int i = 0; i < image->header.height - 2*padding; i++) {
        free(image->pixels[i]);
    }

    free(image->pixels);
    image->pixels = output_pixels;
}

输出情况

  • 偶数Padding输出图像:显示正常的带环绕式Padding的图像
  • 奇数Padding输出图像:显示损坏的图像

怀疑的代码段

我怀疑问题出在以下循环代码中:

for(int i = padding; i < image->header.height + padding; i++) {
    for(int j = padding; j < image->header.width + padding; j++) {
       output_pixels[i][j].red = image->pixels[i-padding][j-padding].red;
       output_pixels[i][j].green = image->pixels[i-padding][j-padding].green;
       output_pixels[i][j].blue = image->pixels[i-padding][j-padding].blue;
    }
}

我尝试调整算法,但这个版本仍是当前最贴合需求的实现。

编辑:问题已解决
原因是BMP的4字节对齐要求。偶数Padding因双边添加,总宽度增量为2倍偶数,自动满足4字节对齐;而奇数Padding的总宽度增量为奇数,破坏了对齐规则。


内容的提问来源于stack exchange,提问作者savannaretro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 22:15:13