将PIL图像转换为MIMEImage

4

我希望使用PIL创建图像,并能够通过电子邮件发送,而无需将其保存到磁盘。

以下是可行的方法,但需要先将其保存到磁盘:

from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

msg = MIMEMultipart()

im = Image.new("RGB", (200, 200))

with open("tempimg.jpg", "w") as f:
    im.save(f, "JPEG")

with open("tempimg.jpg", 'rb') as f:
    img = MIMEImage(f.read())

msg.attach(img)

现在我希望能够做到以下操作:
import StringIO

tempimg = StringIO.StringIO()
tempimg.write(im.tostring())
img = MIMEImage(tempimage.getvalue(), "JPG")
msg.attach(img)

发现某些代码不起作用。在西班牙语的讨论中找到了一些与此相同的问题,但没有提供解决方法,只有一个关于StringIO的指针。

2个回答

9

im.tostring 返回原始图像数据,但您需要传递整个图像文件数据给 MIMEImage,所以请使用StringIO模块将图像保存到内存中并使用该数据:

from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from PIL import Image
import cStringIO

msg = MIMEMultipart()

im = Image.new("RGB", (200, 200))
memf = cStringIO.StringIO()
im.save(memf, "JPEG")
img = MIMEImage(memf.getvalue())

msg.attach(img)

谢谢,那个可行!我之前已经尝试用 Im.save() 了,但是可能在参数上搞错了。 - user1103852

2

由于 Anurag Uniyal 的回答中使用的 cStringIO 模块已在 Python 3.0 中被移除,因此这里提供了适用于 Python 3.x 的解决方案:

要将给定的 PIL 图像(此处为 pil_image)转换为 MIMEImage,请使用 BytesIO 模块将 PIL 图像保存到字节缓冲区中,并使用该缓冲区获取 MIMEImage

from email.mime.image import MIMEImage
from io import BytesIO
from PIL import Image

byte_buffer = BytesIO()
pil_image.save(byte_buffer, "PNG")
mime_image = MIMEImage(byte_buffer.getvalue())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接