使用Python PIL将1920x1080图像上移像素的报错解决需求
解决图像沿Y轴向上平移并填充黑色的问题
问题原因
你写的代码里,当y+100超过图像原始高度(1080)时会触发索引越界错误——比如y取1000时,y+100=1100,已经超出图像y轴的合法范围(0到1079),自然无法访问对应像素。
方法一:用PIL现成方法实现(最简便)
1.1 仿射变换法
直接通过PIL的仿射变换快速完成平移,自动填充黑色:
from PIL import Image img = Image.open("你的图像路径") width, height = img.size # 仿射变换矩阵:仅Y轴向上平移100像素,X轴无变化 shifted_img = img.transform( (width, height), Image.AFFINE, (1, 0, 0, 0, 1, -100), fillcolor="black" ) shifted_img.show() shifted_img.save("平移后的图像.jpg")
1.2 图像粘贴法
先创建黑色背景图,再把原图像的有效区域粘贴到对应位置,逻辑更直观:
from PIL import Image img = Image.open("你的图像路径") width, height = img.size # 创建和原图尺寸一致的黑色背景图 new_img = Image.new("RGB", (width, height), color="black") # 截取原图像中需要保留的部分(去掉底部100像素) cropped_part = img.crop((0, 100, width, height)) # 将截取部分粘贴到新图像顶部 new_img.paste(cropped_part, (0, 0)) new_img.show() new_img.save("平移后的图像.jpg")
方法二:修复你的循环代码
如果想保留自己的循环逻辑,调整循环范围避免越界,再手动填充底部黑色:
from PIL import Image img = Image.open("你的图像路径") pix = img.load() width, height = img.size shift_y = 100 # 仅处理不会触发越界的区域:y范围是0到height-shift_y-1 for x in range(width): for y in range(height - shift_y): pix[x, y] = pix[x, y + shift_y] # 填充底部100行为黑色 for x in range(width): for y in range(height - shift_y, height): pix[x, y] = (0, 0, 0) img.show() img.save("平移后的图像.jpg")
注:原代码的range(1,1919)和range(1,1079)会漏掉边缘像素,用width和height适配性更强。
内容的提问来源于stack exchange,提问作者Checka
相关产品推荐
相关产品推荐

