将PIL图像转换为MIMEImage
我想用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)