Ошибка с сохранением и использованием потока изображения Python IO в памяти - PullRequest
0 голосов
/ 25 мая 2018

В настоящее время я пытаюсь построить данные DataFrame и добавить их в слайд pptx.Я использовал matplotlib + pptx-python, чтобы сделать работу.В процессе я попытался сохранить изображение графика в потоке памяти и использовать его для слайдов pptx.Шаги:

import io
from PIL import Image
from pptx import Presentation
from pptx.util import Inches

#1. Run Python-pptx and open presentation
prs = Presentation('Template.pptx')
title_slide_layout = prs.slide_layouts[6]
slide = prs.slides.add_slide(title_slide_layout)
title = slide.shapes.title
title.text = 'FileName'
left = top = Inches(1) 

#2. plot the data in matplotlib
fig, ax = plt.subplots()
df.groupby('Name').plot(x='Time',y='Score', ax=ax)

#3. save the plot to io in-memory stream
buf = io.BytesIO()
fig.savefig(buf, format='png')
buf.seek(0)
im = Image.open(buf)

#4. add image to slide 
pic = slide.shapes.add_picture(im, left, top)

Но я получил такую ​​ошибку:

AttributeError: 'PngImageFile' object has no attribute 'read'

Знаете ли вы, как решить эту проблему?Кстати, я использую Python 3.6.Я попытался обновить пакет PIL и использовать форматы «png» и «jpg» для своего изображения.Все усилия не сработали.

1 Ответ

0 голосов
/ 26 мая 2018

Не используйте PIL, чтобы открыть файл .png перед передачей его .add_picture():

buf = io.BytesIO()
fig.savefig(buf, format='png')
buf.seek(0)
# ---skip the Image.open() step and feed buf directly to .add_picture()
pic = slide.shapes.add_picture(buf, left, top)

Метод .add_picture() ищет файлоподобный объект, содержащий изображение, котороеbuf в этом случае.Когда вы вызываете Image.open() с помощью buf, вы получаете некоторый объект изображения PIL, который вам не нужен.

...