如何将4张bytes格式等尺寸图片按2×2网格合并
问题分析与修正代码
你的代码存在几个明显问题,导致生成的图片异常:
- 循环遍历
imgarr时,错误地用bytes对象作为文件名,并且引用了未定义的rimg变量,根本没用到当前遍历的图片数据 - 没必要把图片存到本地再读取,既浪费资源又容易出路径错误
- 转成RGBA格式保存,但新建的画布是RGB模式,两者模式不匹配会导致显示异常
- 手动逐个打开临时文件的写法太死板,容易出错
以下是修正后的代码,直接在内存处理所有图片,不需要临时文件:
from PIL import Image import io # 将所有bytes图片转为PIL Image对象,统一模式为RGBA(保留透明通道) images = [] for img_bytes in imgarr: with io.BytesIO(img_bytes) as stream: img = Image.open(stream).convert("RGBA") images.append(img) # 确认所有图片尺寸一致(题目已说明,这里可省略,但加个校验更稳妥) if len(set(img.size for img in images)) != 1: raise ValueError("所有图片尺寸必须相同") # 获取单张图片的宽高 single_w, single_h = images[0].size # 创建2×2网格的新图片,模式和原图片一致 new_img = Image.new("RGBA", (2 * single_w, 2 * single_h)) # 按2×2网格粘贴图片 new_img.paste(images[0], (0, 0)) new_img.paste(images[1], (single_w, 0)) new_img.paste(images[2], (0, single_h)) new_img.paste(images[3], (single_w, single_h)) # 保存最终图片(如果需要转成RGB格式,就用.convert("RGB")再保存) new_img.save("tempimg\\temp.png")
如果你的图片不需要透明通道,也可以把所有RGBA改成RGB,避免模式冲突。另外,这段代码会直接在内存中处理所有图片,省去了读写临时文件的步骤,效率更高也更可靠。
内容的提问来源于stack exchange,提问作者easonoob
相关产品推荐
相关产品推荐

