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 があれば依存の導入なしで実行できる
オプション
オプション |
既定値 |
説明 |
|---|---|---|
|
|
|
|
|
|
|
なし |
この色のピクセルを透明にする (argb4444 向け)。 |
|
出力ファイル名から生成 |
|
|
なし |
定義を名前空間で囲む |
|
なし |
変換前にリサイズする |
|
オフ |
最も近い 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) を返します。