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
相关产品推荐
相关产品推荐

