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
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
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
Merci. J'étais confus entre le texte et les données binaires. Cela a éclairci – Psionman