pyxelはver2.0からカラーパレットを追加して16色を超える色数が使える様になっています。
pyxelの公式サイトの情報で「グラフィックス」の「colors」の項に載っている一文、
「パレットの…」の説明にある「colors.from_list」と「colors.to_list」とその中の例が参考になりそうなので、そこから調べてみました。
・「colors.to_list」:現在のカラーパレットをリストで取得
・「colors.from_list」:カラーパレットをリストでまとめて更新
・「colors[n]」※nは0~254:指定したインデックスのカラーパレットを1つだけ更新範囲外のインデックスを使用したり、要素が255を超えるリストを設定すると以下のエラーが発生します。
----------------------------
pyo3_runtime.PanicException: Number of colors must be between 1 to 255
----------------------------
※インデックスは「0~254」の255色が指定可能です。
pyxelのサンプルプログラム「05_color_palette.py」には16色分のカラーパレットを表示する機能があります。
このサンプルを少し手直しして、追加されたカラーパレットも表示出来る様にしてみました。
手直ししたソースはGoogleドキュメントに載せてあります。
実行画面
パレット番号の0~15は既存のカラーパレットのカラーコードがそのまま設定されています。
16~230は以下のパターンでカラーコードを設定しています。
・各色相の値は0x00→0x33→0x66→0x99→0xcc→0xff→繰り上がって0x00に戻るのを繰り返す。
・0x10000倍の桁が赤、0x100倍の桁が緑、0x1倍の桁が青。
・0xffffffで終了。
※要はWebセーフカラー(ブラウザやOSの種類に関係なく、Web ページで常に表示できる216色のカラー)です。
追加用カラーコード一覧:PNoは通し番号(パレット番号は既存の最終パレット番号(=15)+PNoになります)
※PNo=0(カラーコード:0x000000)はpyxelデフォルトのカラーパレット0に存在するので追加対象から除外
上記から更にカラーパレットを追加して最大数の254まで埋めてみます。
以下の図はパレット番号231以降を最大値(254)まで0埋めして、最終インデックスが分かりやすい様にパレット番号254には0xddddddを上書きで設定しています。
この様に、カラーパレットを最大255色まで設定することが可能です。
次に色を追加することによる画像読み込み時の色変換の変化を確認します。
pyxelではpng等の画像ファイルを読み込んだ際に画像の中のカラーパレットに存在しない色がカラーパレットに存在する近い色に自動変換されます。
そこで、カラーパレットの色数が16色の時と、色数を増やした時とで同じ画像がどの様に変換されるかを比較してみます。
読み込む画像は、Windows標準ソフトのペイントで色の編集時に表示されるカラーパレット部分を切り取って使用します。
ペイント
赤矢印の部分をクリックすると色の編集画面が表示されます。
↓↓↓
「色の編集」で表示されるカラーパレットの部分だけを切り取ってファイルに保存します。
↓↓↓
このファイルをプログラムから参照可能な場所に置いて、pyxelのイメージクラスのloadメソッドで読み込んで表示します。
読み込んで表示した結果が以下になります。
左が16色のまま読み込んだ画像、右がパレット番号230までカラーパレットを追加して読み込んだ画像
※カラーパレット追加前に画像を読み込むと16色の状態で変換されるので、画像はカラーパレット追加後に読み込みます。この様により多くの色が使用された画像に変換されることが分かります。
上記のテストではカラーコードを機械的に設定して追加しましたが、設定する色を調整することでより繊細な色彩の画像に変換することも可能になります。
サンプルとして、以下の花(ツバキ)の画像をカラーパレットを変更して読み込んでみます。
オリジナル画像
左から、
・pyxelデフォルトのカラーパレット
・上記のテストで機械的にパレット番号230まで設定したカラーパレット
・pyxelデフォルト+この画像で使用された色に合わせたカラーパレット
となります。右の画像のカラーパレットは以下の様になっています。
この様に画像に特化したパレット構成にすると再現性がかなり高くなるのが分かると思います。
カラーパレットがこれだけ増えると、キャラやオブジェクト等に少しずつパレットを割り振って、表示するもの毎に部分的に書き換えながら使うと色数はほぼ無制限と考えられます。パレットの管理は大変そうですが…
以上です。