图像翻转本质是像素位置的重新映射,核心在于数组索引与图像坐标的对应关系:水平翻转列索引变为width−1−j,垂直翻转行索引变为height−1−i,双向翻转则映射为imageheight−1−i,需避免越界、重复和原地覆盖。

图像翻转本质是像素位置的重新映射,核心在于理解数组索引如何对应图像坐标,并通过交换或重计算完成重排。不需要额外图像库,纯数组操作即可实现,关键在索引逻辑不写错。
水平翻转:列索引对称重映射
图像每行从左到右对应数组 同一行内列索引递增。水平翻转即每行首尾像素互换,中间向两侧推进。
- 对宽度为 width 的行,原列索引 j 翻转后变为 width − 1 − j
- 只需遍历前半列(j < width // 2),避免重复交换
- 原地操作:直接交换 image[row][j] 与 image[row][width−1−j]
垂直翻转:行索引对称重映射
图像从上到下对应数组 行索引递增。垂直翻转即顶底行互换,第二行与倒数第二行互换,依此类推。
- 对高度为 height 的图像,原行索引 i 翻转后变为 height − 1 − i
- 只需遍历前半行(i < height // 2)
- 高效做法是直接交换整行引用:image[i], image[height−1−i] = image[height−1−i], image[i]
XY双向翻转:组合而非嵌套
同时水平+垂直翻转 ≠ 在一个双层循环里同时改行列索引。那样极易越界或覆盖未处理像素。
- 正确方式是分两步:先垂直翻转所有行顺序,再对每行做水平翻转
- 或一步到位:每个像素 image[i][j] 映射到 image[height−1−i][width−1−j],但需使用临时存储或新数组,避免原地写入冲突
- 位图(如单字节8像素)还需注意位序翻转:一行字节内各bit也要按位镜像,例如 0b10110000 → 0b00001101
实战重排像素变量索引的常见陷阱
手动重排时最容易出错的是边界和方向混淆:
- 越界访问:写成 image[height−i][...](应为 height−1−i)或列用 width−j(缺减1)
- 重复翻转:循环上限设为 height 而非 height//2,导致翻回去
- 原地覆盖:想用单个临时变量逐像素赋值,却在读取前已改写目标位置——必须用对称交换或独立缓存
- 数据类型忽略:RGB三通道数组中,不能只翻单个通道索引;位图中一个字节含多个像素,需先字节级翻转,再位级翻转

















