見出し画像

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での実行時のスクリーンショットを載せておきます。

画像1

この記事でわからないことや間違っていること、その他意見等ありましたらコメントをください。

いいなと思ったら応援しよう!