2017-10-06 3 views
1

Ich kann ein JPEG-Bild laden, es in Bitmap konvertieren und es in einer WX-Anwendung plotten. Es fällt mir jedoch schwer, ein PIL-Bildobjekt in eine Bitmap umzuwandeln, die in eine WX-Anwendung geplottet werden kann.Umwandlung eines PIL-Bildes in WxPython-Bitmap-Bild

Online, der beste Vorschlag, den ich finden konnte, aber so etwas wie

wx.Bitmap(PIL_image.tobytes()) 

zu tun ist, gibt dies mir den folgenden Fehler

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 59: invalid start byte 

oder

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc8 in position 51: invalid continuation byte 

jemand eine Hat guter Tipp, wie man diesen Punkt anspricht? Vielen Dank!

Antwort

2

Es gibt Beispiele überall im Internet, wie man es macht. Aber es gibt einige Bedingungen, die in ihnen nicht abgedeckt sind. Insbesondere beim Konvertieren von wxBitmap() zurück in PIL Image().

Ich poste hier meine modifizierten Versionen dieser Funktionen. Die Konvertierung ist schnell und zuverlässig.



from PIL import Image 
import wx 

def PIL2wx (image): 
    width, height = image.size 
    return wx.BitmapFromBuffer(width, height, image.tobytes()) 

def wx2PIL (bitmap): 
    size = tuple(bitmap.GetSize()) 
    try: 
     buf = size[0]*size[1]*3*"\x00" 
     bitmap.CopyToBuffer(buf) 
    except: 
     del buf 
     buf = bitmap.ConvertToImage().GetData() 
    return Image.frombuffer("RGB", size, buf, "raw", "RGB", 0, 1) 


# Suggested usage is to put the code in a separate file called 
# helpers.py and use it as this: 

from helpers import wx2PIL, PIL2wx 
from PIL import Image 

i = Image.open("someimage.jpg").convert("RGB") 
wxb = PIL2wx(i) 
# Now draw wxb to screen and let user draw something over it using wxDC() and so on... 
# Then pick a wx.Bitmap() from wx.DC() and do something like: 
wx2PIL(thedc.GetAsBitmap()).save("some new image.jpg") 

+0

Es funktioniert, danke, aber ich hatte es so zu ändern: 'Rückkehr wx.Bitmap.FromBuffer (. Breite, Höhe, image.convert ("RGB") ToBytes())' –

+0

Bist Du sicher dass Sie einen extra Punkt zwischen Bitmap und FromBuffer hinzufügen mussten? Nur um es zu bestätigen. Denn wenn Sie das getan haben, dann wurden einige Änderungen in neueren Versionen von wxPython eingeführt, von denen ich noch keine Ahnung habe. Wie für convert(), nun, tut mir leid, ich habe vergessen, es zurückzugeben. Ich habe es entfernt, weil meine aktuelle Anwendung standardmäßig mit RGB arbeitet, so dass extra convert() nicht benötigt wird. Wenn es vorhanden ist, macht es die Funktion nur weitgehend nutzbar, verlangsamt es aber in anderen Fällen. Ich verwende PIL, um ein Bild von der Kamera vorzubereiten, und dann zeichne ich es auf wx.Panel(). So ist jeder Gebrauch wertvoll. – Dalen

+0

Ja, es gab Änderungen. Ohne den Punkt erhältst du nur eine Warnung. Über die RGB-Konvertierung verstehe ich. Ich habe es nur kommentiert, da es für andere Leute nützlich sein könnte, die Ihre Antwort lesen. –

Verwandte Themen