我正在使用pyplot.savefig将matplotlib图保存为.png并且此代码有效:
pyplot.savefig('tempfile.png', bbox_inches='tight', pad_inches=0.0)
i = wx.Image('tempfile.png', 'image/png', -1)
i.Resize(size=(500,500), pos=(0,0), red=255, green=255, blue=255)
png = i.ConvertToBitmap()
self.xrayImage = wx.StaticBitmap(self.panel, -1, png, (380,10), (500,500))
我不希望在程序执行后有这个tempfile.png,理想情况下它甚至不会出现在用户的环境中。我一直在尝试使用python的临时文件功能,但不断获取无效图像,或者不是来自i.Resize行的.png图像。我已经尝试过使用tempfile.TemporaryFile和tempfile.NamedTemporaryFile,但两者都没有工作。以下是我尝试过的一些示例:
temp_png = tempfile.NamedTemporaryFile(suffix='.png')
pyplot.savefig(temp_png)
i.wx.Image(temp_png, 'image/png', -1)
i.Resize(size=(500,500), pos=(0,0), red=255, green=255, blue=255)
png = i.ConvertToBitmap()
self.xrayImage = wx.StaticBitmap(self.panel, -1, png, (380,10), (500,500))
和
with tempfile.TemporaryFile(suffix=".png") as tmpfile:
pyplot.savefig(tmpfile)
tmpfile.seek(0)
i = wx.Image(tmpfile, 'image/png', -1)
# also tried:
# i = wx.Image(tmpfile.read(), 'image/png', -1)
# i = wx.Image(b64encode(tmpfile.read()), 'image/png', -1)
i.Resize(size=(500,500), pos=(0,0), red=255, green=255, blue=255)
png = i.ConvertToBitmap()
self.xrayImage = wx.StaticBitmap(self.panel, -1, png, (380,10), (500,500))
任何帮助将不胜感激!只要用户的计算机上没有文件,我也愿意不使用python的tempfile。
答案 0 :(得分:1)
根据User ImportanceOfBeingEarnest
的建议:完全删除tempfile并使用缓冲区存储savefig
的结果(使用wxPython 4.0.1测试)
import wx
from io import BytesIO
from matplotlib import pyplot as plt
from matplotlib import rc
def get_pyplot_img():
rc('savefig', format='png')
buf = BytesIO()
plt.plot([0, 1, 2], [0, 1, 4], '-')
plt.savefig(buf)
# reset buf pointer
buf.seek(0)
return buf
def get_bitmap(buf):
img = wx.Image(buf, wx.BITMAP_TYPE_PNG)
return wx.Bitmap(img)
答案 1 :(得分:0)
为什么不在显示后删除图像文件?
import wx
import os
import matplotlib
matplotlib.use('agg')
from matplotlib import pyplot as plt
class TestFrame(wx.Frame):
def __init__(self, *args):
wx.Frame.__init__(self, *args)
plt.plot([1.5,2.0,2.5])
fig = plt.gcf()
fig.savefig("/tmp/myimg.png", transparent=True)
aText = wx.StaticText(self,-1,("My Image Display"))
img = wx.Image("/tmp/myimg.png", wx.BITMAP_TYPE_ANY)
Image = wx.StaticBitmap(self, bitmap=wx.BitmapFromImage(img))
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(aText,0,0,0)
sizer.Add(Image,1,0,0)
self.SetSizer(sizer)
self.Fit()
self.Show()
os.remove("/tmp/myimg.png")
if __name__ == "__main__":
app = wx.App()
myframe = TestFrame(None, -1, "Image Test")
app.MainLoop()
答案 2 :(得分:0)
尝试将wx.Bitmap保存到使用tempfile.TemporaryFile创建的临时文件时,我遇到了完全相同的问题。 wx.Bitmap.SaveFile()返回False,我不知道为什么。
作为一种解决方法,我使用了一个临时文件夹,它可以正常工作。类似于:
with tempfile.TemporaryDirectory() as directory:
success = image.SaveFile(directory + "\\temp.png", wx.BITMAP_TYPE_PNG)
if success:
do_something_with_the_picture(directory + "\\temp.png")