Python 3、打开存储在列表中的图像作为文件对象的最佳方式?

In Python 3, best way to open an image stored in a list as a file object?

在 linux 和 windows 中使用 python 3.4,我正在尝试从字符串对象列表创建二维码图像。我不想只将图像存储为文件,因为字符串列表可能会经常更改。然后我想平铺所有对象并将生成的图像显示在屏幕上,供用户使用条形码扫描仪进行扫描。为了让用户知道要扫描哪个代码,我需要在二维码图像中添加一些文本。

我可以正确地创建图像对象列表,它们在列表中,对这些对象调用 .show 可以正确显示它们,但我不知道如何将这些对象视为文件对象来打开它们。提供给 open 函数的对象(在我的例子中是 img_list[0]),在我的 add_text_to_img 中需要支持 readseektell 方法。当我按原样尝试时,出现属性错误。我已经尝试过 BytesIO 和 StringIO,但我收到一条错误消息,指出 Image.open 不支持缓冲区接口。也许我没有正确完成那部分。

我确定有多种方法可以做到这一点,但是在内存中将对象作为文件对象打开的最佳方法是什么?

from io import BytesIO
import qrcode
from PIL import ImageFont, ImageDraw, Image

def make_qr_image_list(code_list):
    """

    :param code_list:   a list of string objects to encode into QR code image
    :return:            a list of image or some type of other data objects
    """
    img_list = []
    for item in code_list:
        qr = qrcode.QRCode(
                            version=None,
                            error_correction=qrcode.ERROR_CORRECT_L,
                            box_size=4,
                            border=10
                            )
        qr.add_data(item)
        qr_image = qr.make_image(fit=True)
        img_list.append(qr_image)

    return img_list

def add_text_to_img(text_list, img_list):
    """
    While I was working on this, I am only saving the first image. Once
    it's working, I'll save the rest of the images to a list.
    :param text_list:   a list of strings to add to the corresponding image.
    :param img_list:    the list containing the images already created from
                        the text_list
    :return:
    """
    base = Image.open(img_list[0])
    # img = Image.frombytes(mode='P', size=(164,164), data=img_list[0])
    text_img = Image.new('RGBA', base.size, (255,255,255,0))

    font    = ImageFont.truetype('sans-serif.ttf', 10)
    draw    = ImageDraw.Draw(text_img)
    draw.text((0,-20),text_list[0], (0,0,255,128), font=font)
    #  include some method to save the images after the text
    #  has been added here. Shouldn't actually save to a file.
    #  Should be saved to memory/img_list
    output = Image.alpha_composite(base,text_img)
    output.show()

if __name__ == '__main__':
    test_list   = ['AlGaN','n-AlGaN','p-AlGaN','MQW','LED AlN-AlGaN']
    image_list  = make_qr_image_list(test_list)
    add_text_to_img(test_list, image_list)
    im          = image_list[0]
    im.save('/my_save_path/test_image.png')
    im.show()

编辑:我已经使用 python 大约一年了,我觉得这是一件很常见的事情,但我什至不确定我是否正在寻找 up/searching为正确的条款。您会搜索哪些主题来回答这个问题?如果有人可以 post 一 link 或两个关于我需要阅读的内容,那将不胜感激。

已经PIL个图像对象; qr.make_image() returns 正确类型的对象(包装器),您不需要再次打开它们。

因此,您需要做的就是:

base = img_list[0]

然后从那里开始。

合成时需要匹配图像模式; QR 码是黑白图像(模式 1),因此要么转换它,要么在 text_img 图像对象中使用相同的模式。 Image.alpha_composite() 操作确实要求两个图像都有一个 alpha 通道。转换基数很容易:

base = img_list[0].convert('RGBA')