对JpegImageFile列表排序时报TypeError:不支持两实例间使用'<'比较
错误原因
- 你当前直接对PIL读取后生成的
JpegImageFile对象执行排序,这类图片对象本身没有定义大小比较规则,所以触发了<运算符不支持的报错。 - 现有写法中
sorted(frames)不会改变原frames列表的顺序:sorted()是返回新列表的函数,你没有把返回值赋值给变量,排序操作相当于没执行。 - 你需要按文件名排序,但先打开图片再排序的逻辑已经丢失了文件名信息,根本无法实现你要的排序效果。
- 额外注意:你的文件名数字从1到10,如果用默认字符串排序,会出现
PhotoIRBalkanf 10排在PhotoIRBalkanf 2前面的问题,需要提取文件名中的数字做数值排序才能得到正确顺序。
修复后代码
import glob from PIL import Image def gif_creator(filename, folder): # 先拿到所有匹配的图片路径 img_paths = glob.glob(f"{folder}/{filename}*.JPG") # 按文件名末尾的数字做数值排序,避免字符串排序的顺序错乱问题 img_paths_sorted = sorted(img_paths, key=lambda x: int(x.split()[-1].split('.')[0])) # 排序完成后再打开图片生成帧列表 frames = [Image.open(path) for path in img_paths_sorted] frame_one = frames[0] # append_images要去掉第一帧,避免第一帧重复出现 frame_one.save(filename+".gif", format="GIF", append_images=frames[1:], save_all=True, duration=150, loop=0)
补充说明
如果你的文件名格式不是固定的「前缀 数字.JPG」结构,可以用正则提取数字,排序的key写为lambda x: int(re.search(r'\d+$', x.rsplit('.',1)[0]).group(1)),导入re库即可使用。
内容的提问来源于stack exchange,提问作者Gorna Oryahovica
相关产品推荐
相关产品推荐

