Есть ли какой-нибудь возможный способ показать изображение из данных base64 в приложении wxPython? - PullRequest
3 голосов
/ 28 сентября 2019

Здравствуйте,

Я делаю приложение на python3 для своего последнего проекта в старшей школе, и у меня возникли некоторые проблемы.Если я хочу показать какие-либо изображения в своем приложении, я должен поместить их в указанный каталог, и я хотел бы просто получить строки base64 для каждого изображения, поместить их в мой код и просто загрузить изображения из этих строк.,Это может сделать мое приложение переносимым без каких-либо дополнительных файлов для копирования.

Я создал несколько функций для этого, но никто не работает


import base64
from PIL import Image
from io import BytesIO

b64imgData = "iVBORw0KGgoAAAANSUhEUgAAA3QAAABMCAYAAAAlUfXmAAAABGdBTUEAALGPC/..."

decodedImgData = base64.b64decode(imgData)
bio = BytesIO(decodedImgData)
img = Image.open(bio)

, и это использовалось для просмотра изображения:

wx.StaticBitmap(panel, -1, img, (50, yHalf/14+20), (xHalf - 100, yHalf/8))

Когда я запускаю код, я получаю это:

Traceback (most recent call last):
  File "C:\Users\dummy\Desktop\PWG\main.py", line 68, in OnInit
    frame = Menu()
  File "C:\Users\dummy\Desktop\PWG\main.py", line 127, in __init__
    wx.StaticBitmap(panel, -1, img, (50, yHalf/14+20), (xHalf - 100, yHalf/8))
TypeError: StaticBitmap(): arguments did not match any overloaded call:
  overload 1: too many arguments
  overload 2: argument 3 has unexpected type 'PngImageFile'
OnInit returned false, exiting...

Моя следующая попытка:


#I used this function from another thread which looks that may work
def PIL2wx (image):
    width, height = image.size
    return wx.BitmapFromBuffer(width, height, image.tobytes())


import base64
from PIL import Image
from io import BytesIO

b64imgData = "iVBORw0KGgoAAAANSUhEUgAAA3QAAABMCAYAAAAlUfXmAAAABGdBTUEAALGPC/..."

decodedImgData = base64.b64decode(imgData)
bio = BytesIO(decodedImgData)
img = Image.open(bio)

finalImage = PIL2wx(img)

wx.StaticBitmap(panel, -1, finalImage, (50, yHalf/14+20), (xHalf - 100, yHalf/8))


, но если я вызываю функцию, она показываетизображение очень размытое и только черное + белое

Я очень благодарен за каждый ответ

1 Ответ

3 голосов
/ 28 сентября 2019

Вы были близки, аргумент растрового изображения wx.StaticBitmap должен быть wx.Bitmap вместо wx.Image.Попробуйте:

b64imgData = "iVBORw0KGgoAAAANSUhEUgAAA3QAAABMCAYAAAAlUfXmAAAABGdBTUEAALGPC/..."
decodedImgData = base64.b64decode(imgData)
bio = BytesIO(decodedImgData)
img = wx.Image(bio)
if not img.IsOk():
    raise ValueError("this is a bad/corrupt image")
# image scaling
width, height  = (xHalf - 100, yHalf/8)
img = img.Scale(width, height, wx.IMAGE_QUALITY_HIGH)  # type: wx.Image
# converting the wx.Image to wx.Bitmap for use in the StaticBitmap
bmp = img.ConvertToBitmap()  # type: wx.Bitmap
wx.StaticBitmap(panel, -1, bmp)

wxpython имеет некоторые встроенные функции для этого документированного здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...