【问题标题】:AttributeError: 'Image' object has no attribute 'getvalue' (PIL)AttributeError:“图像”对象没有属性“getvalue”(PIL)
【发布时间】:2020-11-29 18:23:33
【问题描述】:

我目前正在开发一个将两个图像与 PIL 粘贴在一起的程序,但是 PIL 很奇怪,所以我必须做一些额外的事情才能使用链接。无论如何,现在我不能使用 PIL 输出的内容,因为: AttributeError:“图像”对象没有属性“getvalue”

这是我的代码的重要部分:

async with aiohttp.ClientSession() as session:
    async with session.get(avurl) as second_image:
        image_bytes = await second_image.read()

with Image.open(BytesIO(image_bytes)).convert("RGB") as first_image:
    output_buffer = BytesIO()
    first_image.save(output_buffer, "png")
    output_buffer.seek(0)

async with aiohttp.ClientSession() as session:
    async with session.get("https://i.imgur.com/dNS0WJO.png") as second_image:
        image_bytes = await second_image.read()

with Image.open(BytesIO(image_bytes)) as second_image:
    output_buffer = BytesIO()
    second_image.save(output_buffer, "png")
    output_buffer.seek(0)

first_image.paste(second_image, (0, 0))
buf = io.BytesIO()
first_image.save(buf, "png")
first_image = first_image.getvalue()

谁能告诉我我缺少哪行代码来解决这个问题?或者我做错了什么?

【问题讨论】:

    标签: python image image-processing python-imaging-library


    【解决方案1】:

    图像对象确实没有getvalue 方法,而是BytesIO 实例。 在这里你应该调用buf.getvalue 而不是first_image.getvalue

    buf = io.BytesIO()
    first_image.save(buf, "png")
    first_image = first_image.getvalue()
    

    你的代码有点像这样:https://stackoverflow.com/a/33117447/7051394;但是如果你看一下那个snipper的最后三行,imgByteArr仍然是BytesIO,所以imgByteArr.getvalue()是有效的。

    【讨论】:

    • 如果我执行 first_image.save(buf, "png") buf = buf.getvalue() file = discord.File(fp=buf, filename="pfp.png") 我得到:UnicodeDecodeError :“utf-8”编解码器无法解码位置 0 中的字节 0x89:无效的起始字节
    • 这似乎是一个不同的问题,你最好再问一个问题
    【解决方案2】:

    下面是对代码的更简单且可能更快的重新编写:

    async with aiohttp.ClientSession() as session:
        image1data = await session.get(avurl).read()
        image2data = await session.get("https://i.imgur.com/dNS0WJO.png").read()
    
    image1 = Image.open(BytesIO(image1data)).convert("RGB")
    image2 = Image.open(BytesIO(image2data))
    
    image1.paste(image2, (0, 0))
    buf = BytesIO()
    image1.save(buf, "png")
    composite_image_data = buf.getvalue()
    

    您最终会得到包含合成图像的 PNG 数据的 composite_image_data

    【讨论】:

      猜你喜欢
      • 2021-02-17
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 2022-07-31
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      相关资源
      最近更新 更多