2017-10-18 94 views
-1

我最终想保存我的图片在数据库中,但现在一个文件就行了。保存图像流,然后显示

我已经开始用

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 

回答

1

由于它是数据,而不是文本,然后你要保持它作为一个字节或ByteArray,不海峡。

在wxPython4可以从文件或类似文件的对象加载图像,并转换为位图(如果需要)是这样的:

image = wx.Image(file_object) 
bmp = wx.Bitmap(image) 
+0

感谢。我已经做出了您所建议的更改(请参阅更新后的问题)。我收到消息“流警告:未知数据格式”。我的wx版本是4.0.0b2 gtk2(凤凰) – Psionman

+0

是blue.bytes仍然是一个有效的PNG文件? (是否有你创建该文件的原因,而不仅仅是为了说明这个问题。)你可能需要用模式“rb”打开它,以确保它不被解释为文本。 – RobinDunn

+0

谢谢。我对文本和二进制数据感到困惑。这清除了它 – Psionman

相关问题