保存图像流,然后显示
问题描述:
我最终想保存我的图片在数据库中,但现在一个文件就行了。保存图像流,然后显示
我已经开始用
with open("blue.png", "rb") as imageFile:
f = imageFile.read()
b = bytearray(f)
with open("blue.bytes", "w") as streamFile:
f = streamFile.write(str(b))
这让我看起来像一个文件:
bytearray(b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x0 ...
这是正确的那么远?
我怎样随后读出来并转换为图像? 我自认是绝望困惑我是否要字节或ByteArray并将如何得到这个字符串返回到该形式
我这里有我在尝试通过工作,但我知道这是行不通的
import wx
from io import BytesIO
class MainFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1, 'Demonstrate wxPython image')
self.panel = MainPanel(self)
self.Centre()
self.save_stream()
def save_stream(self):
bitmap = wx.Bitmap('blue.png', wx.BITMAP_TYPE_ANY)
with open("blue.png", "rb") as imageFile:
f = imageFile.read()
b = str(bytearray(f))
with open("blue.bytes", "w") as streamFile:
f = streamFile.write(b)
class MainPanel(wx.Panel):
def __init__(self, frame):
"""Initialise the class."""
wx.Panel.__init__(self, frame)
file_image_sizer = self._image_from_file()
stream_image_sizer = self._image_from_stream()
main_sizer = wx.BoxSizer(wx.HORIZONTAL)
main_sizer.Add(file_image_sizer, flag=wx.ALL, border=10)
main_sizer.Add(stream_image_sizer, flag=wx.ALL, border=10)
self.SetSizerAndFit(main_sizer)
def _image_from_file(self):
image_sizer = wx.BoxSizer(wx.VERTICAL)
bitmap = wx.Bitmap('red.png', wx.BITMAP_TYPE_ANY)
static_bitmap = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap)
static_bitmap.SetBitmap(bitmap)
image_sizer.Add(static_bitmap)
return image_sizer
def _image_from_stream(self):
image_sizer = wx.BoxSizer(wx.VERTICAL)
static_bitmap = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap)
with open("blue.bytes", "rb") as imageFile:
f = imageFile.read()
bitmap = wx.Bitmap(BytesIO(bytes(f)), wx.BITMAP_TYPE_ANY)
static_bitmap = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap)
static_bitmap.SetBitmap(bitmap)
image_sizer.Add(static_bitmap)
return image_sizer
if __name__ == '__main__':
screen_app = wx.App()
main_frame = MainFrame()
main_frame.Show(True)
screen_app.MainLoop()
继罗宾的答案,我已经改变了_image_from_stream功能如下:
def _image_from_stream(self):
image_sizer = wx.BoxSizer(wx.VERTICAL)
static_bitmap = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap)
with open("blue.bytes", "r") as imageFile:
image = wx.Image(imageFile)
bitmap = wx.Bitmap(image)
static_bitmap = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap)
static_bitmap.SetBitmap(bitmap)
image_sizer.Add(static_bitmap)
return image_sizer
答
由于它是数据,而不是文本,然后你要保持它作为一个字节或ByteArray,不海峡。
在wxPython4可以从文件或类似文件的对象加载图像,并转换为位图(如果需要)是这样的:
image = wx.Image(file_object)
bmp = wx.Bitmap(image)
感谢。我已经做出了您所建议的更改(请参阅更新后的问题)。我收到消息“流警告:未知数据格式”。我的wx版本是4.0.0b2 gtk2(凤凰) – Psionman
是blue.bytes仍然是一个有效的PNG文件? (是否有你创建该文件的原因,而不仅仅是为了说明这个问题。)你可能需要用模式“rb”打开它,以确保它不被解释为文本。 – RobinDunn
谢谢。我对文本和二进制数据感到困惑。这清除了它 – Psionman