sceneでPIL Imageを扱う【Pythonista】
最終更新日: 2020/05/11
全体のコード (GitHub)
import io
import ui
from scene import *
from PIL import Image
class MyScene (Scene):
def setup(self):
# PILで画像を読み込む
pil_img = Image.open('test:Lenna')
# PILの画像をテクスチャに変換する
f = io.Bytes.IO()
pil_img.save(f, format='png')
buffer_img = f.getvalue()
ui_img = ui.Image.from_data(buffer_img)
''' 以下の書き方でもOK '''
#with io.BytesIO() as f:
# pil_img.save(f, format='png')
# ui_img = ui.Image.from_data(f.getvalue())
texture_img = Texture(ui_img)
# SpriteNodeを使い、テクスチャをスクリーンに追加する
self.img = SpritNode(texture_img, position=self.size/2)
self.add_child(self.img)
if __name__=='__main__':
run(MyScene(), show_fps=False)
URLを使う場合
import io
import ui
from scene import *
from PIL import Image
from requests import get
class MyScene (Scene):
def setup(self):
# PILで画像を読み込む
url = 'https://hoge.png'
pil_img = Image.open(io.BytesIO(get(url).content))
# PILの画像をテクスチャに変換する
f = io.Bytes.IO()
pil_img.save(f, format='png')
buffer_img = f.getvalue()
ui_img = ui.Image.from_data(buffer_img)
''' 以下の書き方でもOK '''
#with io.BytesIO() as f:
# pil_img.save(f, format='png')
# ui_img = ui.Image.from_data(f.getvalue())
texture_img = Texture(ui_img)
# SpriteNodeを使い、テクスチャをスクリーンに追加する
self.img = SpritNode(texture_img, position=self.size/2)
self.add_child(self.img)
if __name__=='__main__':
run(MyScene(), show_fps=False)
説明
まずは最低限sceneを使うためのコードを書きました。これを実行するとただの灰色の画面が現れます。
from scene import *
class MyScene (Scene):
def setup(self):
pass
if __name__=='__main__':
run(MyScene(), show_fps=False)
その灰色に表示された画面にPIL Imageを表示できるようにしていきます。
はじめに必要なライブラリ(PIL.Image, ui, io)の3つをimportしましょう。
import io
import ui
from PIL import Image
そしたら、PILで画像を読み込みます。
pil_img = Image.open('test:Lenna') # test:Lennaの画像を読み込む
このままではsceneに表示出来ないので一度ioモジュールを使いバッファに画像のデータを保存し、そのデータからuiモジュールを使ってテクスチャに変換します。
f = io.Bytes.IO()
pil_img.save(f, format='png')
buffer_img = f.getvalue()
ui_img = ui.Image.from_data(buffer_img)
texture_img = Texture(ui_img)
あとはスクリーンにSpritNodeで追加するだけです。
self.img = SpritNode(texture_img, position=self.size/2) # 場所を画面中心にセット
self.add_child(self.img)
一応、全体のコードでのiPhone 6sでの実行時のスクリーンショットを載せておきます。
この記事でわからないことや間違っていること、その他意見等ありましたらコメントをください。