2017-10-18 43 views
-1

Je veux éventuellement enregistrer mes images dans une base de données, mais pour l'instant un fichier fera l'affaire.Enregistrer l'image en tant que flux, puis afficher

J'ai commencé avec

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)) 

Cela me donne un fichier qui ressemble à:

bytearray(b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x0 ... 

Est-ce droit jusqu'à présent? Comment puis-je le relire et le convertir en image?

J'avoue être désespérément confus de savoir si je veux octets ou un bytearray et comment obtenir cette chaîne de nouveau dans cette forme

Je ajoute ici ma tentative de faire fonctionner à travers, mais je suis conscient qu'il ne fonctionne pas

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() 

Après la réponse de Robin J'ai changé la fonction de _image_from_stream lire:

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 

Répondre

1

Depuis ses données et pas de texte, vous aurez envie de le garder sous forme d'octets ou bytearray, pas str.

En wxPython4 vous pouvez charger une image à partir d'un fichier ou d'un objet de type fichier, et les convertir en une image bitmap (si nécessaire) comme ceci:

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

Merci. J'ai fait les changements que vous avez suggérés (voir la question mise à jour). Je reçois le message "Avertissement de flux: format de données inconnu". Ma version de wx est 4.0.0b2 gtk2 (phoenix) – Psionman

+0

Est-ce que blue.bytes est toujours un fichier PNG valide? (Et il ya une raison pour laquelle vous créez ce fichier autre que simplement pour l'illustration de cette question.) Vous devrez peut-être l'ouvrir avec le mode "rb" pour vous assurer qu'il n'est pas interprété comme du texte. – RobinDunn

+0

Merci. J'étais confus entre le texte et les données binaires. Cela a éclairci – Psionman