img2cpp: 画像を C++ コードに変換する

bin/img2cpp は画像ファイルを、shapoco::gfx2d::Texture とそのピクセル配列を定義する C++ ヘッダに変換します。

python3 -m pip install -r bin/requirements.txt      # Pillow, numpy
bin/img2cpp sprite.png sprite.hpp                    # RGB565_SWAPPED
bin/img2cpp -f argb4444 -k "#FF00FF" -d diffusion icon.png icon.hpp
bin/img2cpp -f gray1 --name logoBits logo.png logo.hpp
bin/img2cpp -f rgb565_swapped --pot photo.jpg photo.hpp    # 3D テクスチャ向けに 2 の冪へリサイズ
uv run bin/img2cpp ...                               # uv があれば依存の導入なしで実行できる

オプション

オプション

既定値

説明

-f, --format

rgb565_swapped

rgb565_swapped (バイトスワップ済みの値を uint16_t で出力) / rgb565 (ネイティブバイト順、uint16_t で出力) / argb4444 / rgb444 / gray1

-d, --dither

none

none (四捨五入) / diffusion (Floyd-Steinberg) / pattern (4x4 Bayer)

-k, --key-color

なし

この色のピクセルを透明にする (argb4444 向け)。#FF8000、orange、F80 など

--name

出力ファイル名から生成

Texture の変数名 (配列は <name>Data)

--namespace

なし

定義を名前空間で囲む

--resize WxH

なし

変換前にリサイズする

--pot

オフ

最も近い 2 の冪のサイズにリサイズする

幅か高さが 2 の冪でない場合は注意メッセージを出します (2D では問題ありませんが 3D テクスチャには使えません)。

出力

#ifndef ASSETS_SPRITE_HPP
#define ASSETS_SPRITE_HPP

// Generated by img2cpp from sprite.png
// 32x32, argb4444, dither=none, 2048 bytes

#include "shapoco/gfx2d/surface.hpp"

namespace assets {

alignas(4) static const uint16_t spriteData[] = {
  0x0000, 0xF13A, ...
};

static const shapoco::gfx2d::Texture sprite = {
  shapoco::gfx2d::PixelFormat::ARGB4444, 32, 32, 64, spriteData,
};

}  // namespace assets

#endif
  • メモリ配置は ピクセルフォーマットと色 の定義と一致します。rgb444 はバイト列 (uint8_t) として、 rgb565 と argb4444 は uint16_t の値として、rgb565_swapped はバイトスワップ済みの uint16_t の値として 出力されるので、ターゲットのバイト順によらず定義どおりの配置になります。 配列は alignas(4) で 16bit アクセス可能に揃えられます。

  • 量子化は四捨五入です (ライブラリの実行時変換は切り捨て)。

  • 使う側は #include "sprite.hpp" して g.drawImage(assets::sprite, x, y) のように参照するだけです。

共通モジュール

画像変換のコードは bin/shapogfx_imgconv.py にあり、gltf2cpp と共有されています。 Python から直接使うこともできます: convert(image, fmt, dither, key_color) は (width, height, stride, data, elem_type) を返します。