加入离线 sprite 与位图字体转换流程
Demo 现在通过生成的 C++ 头文件使用测试 sprite 和像素风 bitmap font,避免在运行时解码 PNG/TTF。同步补充资源转换文档,明确源资源、生成脚本和生成头文件需要一起提交,保证后续可追溯和可重新生成。 Constraint: IMX6U 运行时路径应尽量轻量,避免图片/字体解码开销 Constraint: 生成像素沿用当前 framebuffer 的 uint32_t RGBA 格式 Rejected: 运行时加载 PNG/TTF | 会增加解码依赖和运行时成本 Confidence: high Scope-risk: moderate Directive: 修改 sprite 或字体时,必须同步提交源资源、转换脚本和生成头文件 Tested: cmake -B build-win .; cmake --build build-win --config Release Not-tested: 尚未在 IMX6U 真机上验证 ARM framebuffer/SDL 后端
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
"""
|
||||
将 PNG 图片转换为 C 头文件(uint32_t 像素数组)。
|
||||
|
||||
用法:
|
||||
python tools/png_to_header.py input.png output.h [var_name]
|
||||
|
||||
像素格式: (R << 24) | (G << 16) | (B << 8) | A
|
||||
与 FrameBuffer 的 uint32_t 格式一致。
|
||||
|
||||
如果图片没有 alpha 通道,A 默认为 0xFF。
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
|
||||
from PIL import Image
|
||||
|
||||
|
||||
def convert(input_path: str, output_path: str, var_name: str):
|
||||
img = Image.open(input_path).convert("RGBA")
|
||||
w, h = img.size
|
||||
pixels = list(img.getdata()) if not hasattr(img, "get_flattened_data") else list(img.get_flattened_data())
|
||||
|
||||
packed = []
|
||||
for r, g, b, a in pixels:
|
||||
packed.append((r << 24) | (g << 16) | (b << 8) | a)
|
||||
|
||||
with open(output_path, "w", encoding="utf-8") as f:
|
||||
f.write("// Auto-generated by tools/png_to_header.py\n")
|
||||
f.write(f"#pragma once\n#include <cstdint>\n\n")
|
||||
f.write(f"static const int32_t {var_name}_width = {w};\n")
|
||||
f.write(f"static const int32_t {var_name}_height = {h};\n\n")
|
||||
f.write(f"static const uint32_t {var_name}_pixels[] = {{\n")
|
||||
|
||||
for i in range(0, len(packed), 16):
|
||||
chunk = packed[i : i + 16]
|
||||
line = ", ".join(f"0x{p:08X}" for p in chunk)
|
||||
f.write(f" {line},\n")
|
||||
|
||||
f.write("};\n")
|
||||
|
||||
|
||||
def main():
|
||||
if len(sys.argv) < 3:
|
||||
print(f"用法: {sys.argv[0]} input.png output.h [var_name]")
|
||||
sys.exit(1)
|
||||
|
||||
input_path = sys.argv[1]
|
||||
output_path = sys.argv[2]
|
||||
|
||||
if len(sys.argv) >= 4:
|
||||
var_name = sys.argv[3]
|
||||
else:
|
||||
# 从文件名生成变量名: player_idle.png -> player_idle
|
||||
var_name = os.path.splitext(os.path.basename(input_path))[0]
|
||||
|
||||
convert(input_path, output_path, var_name)
|
||||
print(f"已生成: {output_path} (var: {var_name}, 像素数: {var_name}_width * {var_name}_height)")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user