源代码变更: - main/dzbj/bg_gif_demo.c/h: 方案 C 最终实现 - JPG 背景图(lv_img) + 透明 GIF(lv_gif) 叠加 - main/dzbj/dual_gif_demo.c/h: 方案 B 中间产物 - 双 GIF 循环切换 - main/dzbj/sprite_demo.c/h: 方案 A 已弃用 - DMA 直写 GRAM 与 LVGL 争抢 LCD IO 失败 - main/dzbj/ai_chat_ui.c: 集成 USE_BG_GIF_POC 开关,加载背景图+透明 GIF - main/dzbj/lcd.c: panel_handle 移除 static,便于其他模块访问 - main/CMakeLists.txt: 新增 3 个 dzbj 模块编译 资源新增: - spiffs_image/Background_360x360.jpg: 设备背景图(20KB) - spiffs_image/hiyori_m05.gif: Cubism Editor 直接导出的透明 GIF(2.3MB) - docs/Rtc_AIavatar/: Live2D 模型(Hiyori/Haru) + 32 段 Haru GIF + 方案文档第18章 PoC 实战记录 - tools/sprite_poc/: Python GIF→RGB565 转换脚本 踩坑要点(详见 docs/Rtc_AIavatar 第18章): - PIL Image.quantize() 会破坏 RGBA 透明度,必须改用 gifsicle - PIL 保存动画 GIF 仅第1帧有透明,后续帧不透明 - LVGL gifdec 按帧读取 - Cubism Editor 直接导出 GIF 才能逐帧保留透明信息(FREE 版限制部分模型) - gifsicle --lossy 会严重锯齿化,去掉只保留 --colors 256 + -O3 即可 - 裁剪居中需用全帧 bbox 不能只看第1帧(Live2D 角色每帧位置有偏移) - LVGL 默认不支持 PNG,背景图用 JPG + esp_jpeg 解码到 RGB565 buffer - 透明 GIF 显示黑色背景: gifdec.c canvas 初始化 alpha 须改为 0x00
118 lines
2.7 KiB
JSON
118 lines
2.7 KiB
JSON
{
|
|
"idf.openOcdConfigs": [
|
|
"board/esp32s3-bridge.cfg"
|
|
],
|
|
"idf.customExtraVars": {
|
|
"IDF_TARGET": "esp32s3"
|
|
},
|
|
"idf.flashType": "UART",
|
|
"idf.portWin": "COM9",
|
|
"files.associations": {
|
|
"algorithm": "cpp",
|
|
"atomic": "cpp",
|
|
"bit": "cpp",
|
|
"cctype": "cpp",
|
|
"charconv": "cpp",
|
|
"chrono": "cpp",
|
|
"clocale": "cpp",
|
|
"cmath": "cpp",
|
|
"compare": "cpp",
|
|
"concepts": "cpp",
|
|
"condition_variable": "cpp",
|
|
"cstddef": "cpp",
|
|
"cstdint": "cpp",
|
|
"cstdio": "cpp",
|
|
"cstdlib": "cpp",
|
|
"cstring": "cpp",
|
|
"ctime": "cpp",
|
|
"cwchar": "cpp",
|
|
"exception": "cpp",
|
|
"format": "cpp",
|
|
"forward_list": "cpp",
|
|
"fstream": "cpp",
|
|
"functional": "cpp",
|
|
"initializer_list": "cpp",
|
|
"iomanip": "cpp",
|
|
"ios": "cpp",
|
|
"iosfwd": "cpp",
|
|
"iostream": "cpp",
|
|
"istream": "cpp",
|
|
"iterator": "cpp",
|
|
"limits": "cpp",
|
|
"list": "cpp",
|
|
"locale": "cpp",
|
|
"map": "cpp",
|
|
"memory": "cpp",
|
|
"mutex": "cpp",
|
|
"new": "cpp",
|
|
"optional": "cpp",
|
|
"ostream": "cpp",
|
|
"ratio": "cpp",
|
|
"regex": "cpp",
|
|
"sstream": "cpp",
|
|
"stdexcept": "cpp",
|
|
"stop_token": "cpp",
|
|
"streambuf": "cpp",
|
|
"string": "cpp",
|
|
"system_error": "cpp",
|
|
"thread": "cpp",
|
|
"tuple": "cpp",
|
|
"type_traits": "cpp",
|
|
"typeinfo": "cpp",
|
|
"unordered_map": "cpp",
|
|
"utility": "cpp",
|
|
"vector": "cpp",
|
|
"xfacet": "cpp",
|
|
"xhash": "cpp",
|
|
"xiosbase": "cpp",
|
|
"xlocale": "cpp",
|
|
"xlocbuf": "cpp",
|
|
"xlocinfo": "cpp",
|
|
"xlocmes": "cpp",
|
|
"xlocmon": "cpp",
|
|
"xlocnum": "cpp",
|
|
"xloctime": "cpp",
|
|
"xmemory": "cpp",
|
|
"xstddef": "cpp",
|
|
"xstring": "cpp",
|
|
"xtr1common": "cpp",
|
|
"xtree": "cpp",
|
|
"xutility": "cpp",
|
|
"__bit_reference": "cpp",
|
|
"__hash_table": "cpp",
|
|
"__locale": "cpp",
|
|
"__node_handle": "cpp",
|
|
"__split_buffer": "cpp",
|
|
"__tree": "cpp",
|
|
"__verbose_abort": "cpp",
|
|
"array": "cpp",
|
|
"bitset": "cpp",
|
|
"cstdarg": "cpp",
|
|
"cwctype": "cpp",
|
|
"deque": "cpp",
|
|
"execution": "cpp",
|
|
"print": "cpp",
|
|
"queue": "cpp",
|
|
"stack": "cpp",
|
|
"string_view": "cpp",
|
|
"variant": "cpp",
|
|
"complex": "cpp",
|
|
"sdkconfig.h": "c",
|
|
"unordered_set": "cpp",
|
|
"cinttypes": "cpp",
|
|
"span": "cpp",
|
|
"osmemory": "cpp",
|
|
"osutility": "cpp",
|
|
"__config": "cpp",
|
|
"volc_device_manager.h": "c",
|
|
"version": "cpp",
|
|
"random": "cpp",
|
|
"*.obj": "cpp"
|
|
},
|
|
"idf.port": "/dev/tty.debug-console",
|
|
"idf.espIdfPath": "/Users/rdzleo/esp/esp-idf/v5.4.2/esp-idf",
|
|
"idf.toolsPath": "/Users/rdzleo/.espressif",
|
|
"idf.pythonInstallPath": "/opt/homebrew/bin/python3",
|
|
"idf.currentSetup": "/Users/rdzleo/esp/esp-idf/v5.4.2/esp-idf"
|
|
}
|