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

Python Pillow库为何会交换X轴与Y轴?

PIL中像素坐标X/Y轴反转问题的原因与解决

我参考示例创建了一张10x10的蓝色图片,尝试将[1,4]位置的像素改为红色时,发现实际变红的是[4,1]位置;使用Image.frombytes函数时也存在同样的X、Y轴交换问题。查阅PixelAccess类文档未找到相关说明,当前使用Python 3.10.6和PIL 9.2.0,旧版本相关帖子不适用。虽然直接交换X/Y坐标能解决问题,但不清楚背后的原因。

测试代码

from PIL import Image
input = Image.new(mode="RGB", size=(10, 10), color="blue")
input.save("input", format="png")
pixel_map = input.load()
pixel_map[1,4] = (255,0,0)
input.save("path\\example.png", format="png")

补充测试(竖线变横线)

替换上述代码中pixel_map[1,4] = (255,0,0)的代码如下:

i = 0
j = 0
for i in range(10):
    for j in range(10):
        if j == 4 or j == 5:
            pixel_map[i,j] = (255,0,0)

原本预期生成竖线,实际却是横线。

原因解释

PIL的PixelAccess采用**(列索引, 行索引)**的坐标顺序:

  • 第一个参数是水平方向的X轴(从左到右,索引从0开始)
  • 第二个参数是垂直方向的Y轴(从上到下,索引从0开始)

而多数人会直觉认为坐标是**(行索引, 列索引)**,这种认知差异导致了看起来坐标反转的现象。比如你传入的(1,4),实际对应第2列、第5行的像素,而非你预期的第2行、第5列。

解决办法

  1. 直接调整坐标顺序:将你直觉中的(行, 列)改为(列, 行),比如把pixel_map[i,j]改成pixel_map[j,i]
  2. 封装转换函数:如果习惯按(行, 列)操作,可以封装一个函数统一处理:
def set_pixel(pixel_map, row, col, color):
    pixel_map[col, row] = color

# 使用示例
set_pixel(pixel_map, 1, 4, (255,0,0))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 20:06:24