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
中需要支持 read
、seek
和 tell
方法。当我按原样尝试时,出现属性错误。我已经尝试过 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')
在 linux 和 windows 中使用 python 3.4,我正在尝试从字符串对象列表创建二维码图像。我不想只将图像存储为文件,因为字符串列表可能会经常更改。然后我想平铺所有对象并将生成的图像显示在屏幕上,供用户使用条形码扫描仪进行扫描。为了让用户知道要扫描哪个代码,我需要在二维码图像中添加一些文本。
我可以正确地创建图像对象列表,它们在列表中,对这些对象调用 .show 可以正确显示它们,但我不知道如何将这些对象视为文件对象来打开它们。提供给 open 函数的对象(在我的例子中是 img_list[0]
),在我的 add_text_to_img
中需要支持 read
、seek
和 tell
方法。当我按原样尝试时,出现属性错误。我已经尝试过 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')