使用alpha_composite合并4张图片时报images do not match错误如何解决
报错原因
Image.alpha_composite() 对输入参数有强制要求,两个传入的图片必须同时满足两个条件:
- 图像模式均为RGBA
- 宽高尺寸完全相同
你代码中第一次合并im1和im2没有报错,说明这两张图的尺寸是匹配的,到合并com1和im3时触发报错,本质是im3的宽高和基准尺寸不一致,同理im4也大概率存在尺寸不匹配的问题。
解决方案
提供两种可直接落地的修改方案:
方案1:统一缩放所有上层图层尺寸
如果你可以接受图层拉伸适配背景尺寸,直接给所有非背景图层增加resize操作,对齐背景图尺寸即可:
#### Generate Images for item in all_images: # 读取背景图作为尺寸基准 im1 = Image.open(f'./trait-layers/backgrounds/{background_files[item["Background"]]}.jpg').convert('RGBA') base_size = im1.size # 其他图层统一缩放到基准尺寸 im2 = Image.open(f'./trait-layers/elephants/{elephant_files[item["Elephant"]]}.png').convert('RGBA').resize(base_size) im3 = Image.open(f'./trait-layers/hats/{hat_files[item["Hat"]]}.png').convert('RGBA').resize(base_size) im4 = Image.open(f'./trait-layers/smoke/{smoke_files[item["Smoke"]]}.png').convert('RGBA').resize(base_size) #Create each composite com1 = Image.alpha_composite(im1, im2) com2 = Image.alpha_composite(com1, im3) com3 = Image.alpha_composite(com2, im4) #Convert to RGB rgb_im = com3.convert('RGB') file_name = str(item["tokenId"]) + ".png" rgb_im.save("./images/" + file_name)
方案2:改用带alpha蒙版的paste方法(更灵活)
如果不想拉伸图层变形,可以替换alpha_composite为paste方法,不需要上层图层和底图尺寸完全一致,还可以自定义图层摆放位置:
#### Generate Images for item in all_images: # 读取背景图作为底图 base = Image.open(f'./trait-layers/backgrounds/{background_files[item["Background"]]}.jpg').convert('RGBA') # 依次粘贴上层图层,(0,0)为左上角坐标,可根据需求调整位置 im2 = Image.open(f'./trait-layers/elephants/{elephant_files[item["Elephant"]]}.png').convert('RGBA') base.paste(im2, (0,0), mask=im2) im3 = Image.open(f'./trait-layers/hats/{hat_files[item["Hat"]]}.png').convert('RGBA') base.paste(im3, (0,0), mask=im3) im4 = Image.open(f'./trait-layers/smoke/{smoke_files[item["Smoke"]]}.png').convert('RGBA') base.paste(im4, (0,0), mask=im4) # 导出 rgb_im = base.convert('RGB') file_name = str(item["tokenId"]) + ".png" rgb_im.save("./images/" + file_name)
内容的提问来源于stack exchange,提问作者Austin Simpkins
相关产品推荐
相关产品推荐

