为何Pillow的getpixel()函数可接受负坐标值?
为什么Pillow的getpixel()接受负坐标还能正常运行?
你遇到的这个情况是Pillow底层的默认行为:当传入getpixel()的坐标为负数时,它会对图像的尺寸进行取模运算(循环映射),而非直接抛出错误。
具体逻辑:
- 负x坐标:
x = -n会被映射为图像的width - n位置(比如x=-1对应图像最右侧的像素,即width-1) - 负y坐标:
y = -n会被映射为图像的height - n位置
这种行为属于Pillow的实现细节,官方文档未特意强调,但属于长期存在的既定逻辑。
你的代码问题根源
你当前计算x_true的方式有误:
x_true = x - map_canvas.winfo_x()
event.x是相对于整个窗口的坐标,map_canvas.winfo_x()是canvas在窗口内部的x偏移,点击窗口左侧(canvas之外)时必然得到负的x_true。
更合理的做法是把点击事件绑定到canvas本身,这样event.x和event.y直接是相对于canvas的坐标,无需额外计算:
# 替换原window绑定逻辑 map_canvas.bind("<Button-1>", obtenir_couleur) # 修改获取颜色的函数 def obtenir_couleur(event): x, y = event.x, event.y # 先做边界检查,避免取模行为干扰 if 0 <= x < mapCouleur.width and 0 <= y < mapCouleur.height: pixel_color = mapCouleur.getpixel((x, y)) print(pixel_color) else: print("点击位置不在图像范围内")
额外建议
如果需要严格控制坐标有效性,调用getpixel()前一定要做边界检查,避免因Pillow的取模行为得到不符合预期的像素值。
内容的提问来源于stack exchange,提问作者Dylseat
相关产品推荐
相关产品推荐

