C语言600*600图像左右拼接代码逻辑错误排查
基于stb_image实现图像拼接时,for循环的逻辑错误通常集中在索引计算、行列顺序、通道处理这几个核心点上,以下是最容易踩的坑:
行列顺序搞反,导致图像扭曲错位
stb_image采用行优先存储(先存完整一行的所有像素,再存下一行),如果循环中先遍历列再遍历行,或者计算像素索引时把行号和列号的顺序写反,会直接导致图像结构混乱。比如错误地使用(x * height + y) * channels计算索引,而正确的应该是(y * width + x) * channels(y是行号,x是列号)。右侧图像的列索引未做偏移
拼接右侧300列时,需要将新图像的列号(300599)转换为第二张图的列号(0299),也就是减去300。如果直接用新图像的列号去访问第二张图的像素,会超出第二张图的有效列范围(假设第二张图用于拼接的部分是左300列),导致取到错误的像素甚至越界内存。忽略图像通道数,引发颜色混乱
不管原图是RGB还是RGBA格式,每个像素都对应3或4个字节的通道数据。如果计算索引时没有乘以通道数,或者循环只处理单个字节而不是整个像素的所有通道,会导致颜色通道错位(比如把红色值写到绿色通道),最终输出的图像颜色完全不对。循环边界设置错误,越界访问
图像的行、列索引都是从0开始计数的,600×600的图像行号范围是0~599,列号同理。如果循环写成for (y = 0; y <= height; y++)或者列号范围错误,会访问到图像数据之外的内存,出现乱码、条纹甚至程序崩溃。
正确的循环示例参考
假设已通过stb_image加载好两张源图像(img1、img2)和输出图像缓冲区(output),通道数为channels,源图像宽度至少为300:
const int output_width = 600; const int output_height = 600; const int split_col = 300; for (int y = 0; y < output_height; y++) { for (int x = 0; x < output_width; x++) { int output_idx = (y * output_width + x) * channels; if (x < split_col) { // 取第一张图的对应像素 int img1_idx = (y * img1_width + x) * channels; for (int c = 0; c < channels; c++) { output[output_idx + c] = img1[img1_idx + c]; } } else { // 第二张图的列号需要偏移split_col int img2_x = x - split_col; int img2_idx = (y * img2_width + img2_x) * channels; for (int c = 0; c < channels; c++) { output[output_idx + c] = img2[img2_idx + c]; } } } }
内容的提问来源于stack exchange,提问作者Encipher

