将PIL图像转换为MIMEImage

4 投票
2 回答
2001 浏览
提问于 2025-04-17 08:33

我想用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 个回答

2

由于在Python 3.0中已经移除了Anurag Uniyal答案中使用的cStringIO模块,这里提供一个适用于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())
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)

撰写回答