如何在C语言中将3张等尺寸8bit位图合并为一张宽幅位图?
合并3张同尺寸8bit位图为宽幅位图的实现验证与优化
原代码问题分析
原代码的核心问题是源图像的列索引计算逻辑错误:
- 第二张图的源列应该是
col - width/3,而非col - width;第三张图的源列应为col - 2*(width/3),不是col - 2*width。 - 原写法会直接导致源指针越界访问(因为目标图宽度
width=4320远大于单张图宽度1440),触发内存错误。
修正后的正确实现
你调整后的代码能正常运行,本质是修正了源列的计算逻辑。这里提供更清晰、可读性更强的写法,避免重复计算和硬编码:
unsigned char *img, *triple_img; // 省略内存分配、图像读取等前置步骤 const int single_width = 1440; const int height = 1080; const int triple_width = single_width * 3; // 复制第一张图 for (int row = 0; row < height; row++) { for (int col = 0; col < single_width; col++) { triple_img[row * triple_width + col] = img[row * single_width + col]; } } // 复制第二张图(假设此时img指向第二张图的起始地址) for (int row = 0; row < height; row++) { for (int col = 0; col < single_width; col++) { int target_col = single_width + col; triple_img[row * triple_width + target_col] = img[row * single_width + col]; } } // 复制第三张图(假设此时img指向第三张图的起始地址) for (int row = 0; row < height; row++) { for (int col = 0; col < single_width; col++) { int target_col = single_width * 2 + col; triple_img[row * triple_width + target_col] = img[row * single_width + col]; } }
逻辑说明与优化
- 明确定义
single_width和triple_width,避免重复计算width/3,提升代码可维护性。 - 每张图的复制逻辑统一:源列范围始终是
0~single_width-1,目标列分别对应宽幅图的左、中、右三段。 - 如果三张图的像素数据是连续存储在
img缓冲区中(比如前1440*1080是第一张,中间是第二张,最后是第三张),可以用memcpy替代嵌套循环,效率更高:
// 假设img包含连续的三张图数据 unsigned char *src_ptr = img; // 复制第一张图到目标图左侧 memcpy(triple_img, src_ptr, single_width * height); src_ptr += single_width * height; // 复制第二张图到目标图中间 memcpy(triple_img + single_width, src_ptr, single_width * height); src_ptr += single_width * height; // 复制第三张图到目标图右侧 memcpy(triple_img + single_width * 2, src_ptr, single_width * height);
内容的提问来源于stack exchange,提问作者ATSlooking4things
相关产品推荐
相关产品推荐

