pyxelには読み込んだイメージ保存する機能があります。

 

この保存機能は拡張したパレットにも対応しているので255色のイメージも保存可能です。

 

但し、リソースエディタで開いても選べる色が16色なので編集は困難です。

※255色のパレットをイメージ1or2に保存しておいて、そこから1ドットコピーで色選択してイメージ0のエリアにペーストして絵を完成させる等の方法もありますが、現実的ではありません。

※リソースエディタで表示される色はパレット番号に割り当てられた色で表示されない場合があります。プログラムで保存したイメージとリソースエディタで開いたイメージは表示される色が必ずしも一致しません。

※サイズの拡張と色数追加対応されたことを考えると、そのうちリソースエディタでも対応すると思われます。

 

 

・プログラム上で作成したイメージをリソースファイル(.pyxres)に保存する方法

 

使用するリソース

※リソースはソースと同階層に作成した"assets"フォルダに置きます。

 

リソースファイル(savetest.pyxres)

変化が分かりやすい様に32×32の範囲を単色で色付けしておきます。

 

 

パレットファイル(savetest.pyxpal)

内容は、pyxel標準の16色+Webセーフカラーのコード(計231色)

※255色ではありませんが、ここの解説ではこのデータで話を進めます。

パレットファイルの内容

 

 

読み込み用イメージファイル(loadsample.png)

※サイズは32×32

Windows標準のペイントのカラーパレットを切り抜いて32×32に縮小しました。

 

上の画像が見づらいので拡大表示します。

 

※読み込み時にはパレットに存在しない色がパレットに存在する近い色に変換されるので、この画像よりかなり荒くなります。

 

 

※リソースはこちらを参照すると分かりやすいと思います。

 

 

--テスト用ソース--------------------------

import pyxel as px

 

class App:

    def __init__(self):

        px.init(50,50,title="savetest",display_scale=6)

        px.load("assets/savetest.pyxres")

 

        px.run(self.update,self.draw)

 

    def update(self):

        if px.btnp(px.KEY_S):

            px.save("assets/savetest.pyxres")

 

        if px.btnp(px.KEY_L):

            px.images[0].load(0,0,"assets/loadsample.png")

 

    def draw(self):

        px.cls

 

        px.blt(0,0,0,0,0,32,32)

 

App()

----------------------------

 

このソースを実行してイメージの保存機能を確認します。

 

1.実行時

実行画面にリソースファイルの内容(32×32の単色の四角)が表示されます。

 

 

2.Lキー押下時(読み込み用イメージファイル(loadsample.png)の読み込み&表示)

loadsample.pngファイルが読み込まれます。

※パレットに存在しない色はパレットに存在する近い色に変換されます。

 

 

3.Sキー押下(リソースファイル(savetest.pyxres)に保存)

リソースファイルに保存されます。

※リソースエディタを開くと保存した画像とはかなり違う色で表示されます。

※ややこしいですが、パレット番号は上記の2で表示された絵と一致している様です。

 

保存後にリソースエディタで保存したイメージを表示

 

 

4.一度終了して再度実行

リソースファイルが更新されているので、最初に読み込んだ単色ではなく保存した絵が読み込まれます

※リソースエディタで表示された色ではなく、保存した色で読み込まれます。

 

 

この様にプログラムで作成したイメージリソースファイルに保存することが出来ます。

 

※saveメソッドで指定するファイル名を変更することで別のファイルに保存することも可能です。但し、パレットファイルは作成されないので、保存したリソースファイル用のパレットファイルを作成する必要があります。

 

(1)は以上です。(2)に続きます。