You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 03:50:19