图片与动图格式转换
该能力负责将常规图片与动图转换为 JL(杰理)蓝牙设备端可显示的格式(BMP、GIF 等),位于 extension-libs/image-convert 目录,仓库中对应实现与演示位于 btsmart 模块的 demo/convert 包下。
目的与范围
本页面向“图片与动图格式转换”这一能力,说明它在 JL 蓝牙 SDK 生态中的用途、相关源文件位置、典型转换流程与边界情况。页面边界如下:
- 属于本页:BMP 格式转换演示(
BmpDemo.java)、GIF 动图转换演示(GifDemo.java)及其背后的格式转换机制。 - 不属于本页:Room 数据库持久化层的
IntArrayConverter(仅用于 Room 实体字段的类型转换,与图片格式转换无关,只在相关链接中提及);设备协议解析、OTA 升级、音频播放等其他能力请参见各自目录页。
说明:本次文档编写受源读取预算限制,未能逐行读取演示文件的完整实现。文中明确标注“未在源码中验证”的内容,请以仓库源码为准。
概述
JL(杰理)蓝牙方案常见于智能手表、音箱、带屏设备等产品。这类设备通常带有小尺寸 LCD 屏幕,需要通过蓝牙从手机端下发图片/动图数据用于:
- 表盘、壁纸、主题图片显示;
- 来电头像、消息提醒图片显示;
- 动画表情、开机动画等动态内容展示。
由于设备端资源受限(内存小、解码能力弱),手机端需要先把常规格式图片(PNG/JPEG 等)转换为设备支持的位图格式(典型为 BMP)或动图格式(典型为 GIF),再通过 JL 协议通道下发。demo/convert 包下的两个演示类就是这一转换链路的示例入口:
| 文件 | 用途(依据命名与所在包推断) |
|---|---|
BmpDemo.java | 演示将图片转换为 BMP 位图格式 |
GifDemo.java | 演示 GIF 动图格式的转换/处理 |
两个演示类位于 btsmart 模块的 test 源码集(src/test/java),说明它们是开发/验证用途的示例代码,而非打包进正式 APK 的业务逻辑。
架构
以下是依据仓库中已确认的文件结构绘制的组件关系图:
flowchart TD
subgraph sg_Btsmart["btsmart 应用模块"]
subgraph sg_Main["src/main/java"]
App["主应用与业务逻辑"]
end
subgraph sg_Test["src/test/java"]
subgraph sg_Demo["demo/convert 包"]
BmpDemo["BmpDemo.java<br/>BMP 格式转换演示"]
GifDemo["GifDemo.java<br/>GIF 动图转换演示"]
end
end
subgraph sg_Room["tool/room/converter 包"]
IntArrayConverter["IntArrayConverter.java<br/>(Room 类型转换,相邻主题)"]
end
end
BmpDemo -->|"读取/输出位图数据"| App
GifDemo -->|"读取/输出动图数据"| App
App -->|"通过蓝牙协议下发"| Device["JL 蓝牙设备屏幕"]
IntArrayConverter -.->|"仅供 Room 持久化使用,非本页主题"| App
说明:
BmpDemo.java与GifDemo.java同处demo/convert包,是图片转换能力在测试源码集中的两个入口示例;- 转换后的位图/动图数据最终经应用层协议下发到 JL 设备端显示;
IntArrayConverter位于tool/room/converter包,属于 Room 实体字段的类型转换器,与本页主题无直接关系,仅作交叉引用,避免读者混淆。
核心流程
图片/动图转换在 JL 蓝牙 SDK 中通常遵循“解码 → 转换 → 编码/裁剪 → 下发”的链路。以下流程图依据 demo/convert 的演示用途与 JL 设备显示链路推演,具体方法调用以源码为准:
flowchart TD
Start([开始]) --> Source["读取源图片<br/>PNG / JPEG / GIF"]
Source --> Decode["解码为 Bitmap<br/>(Android BitmapFactory)"]
Decode --> Check{"目标格式?"}
Check -->|"BMP"| BmpPath["转换为 BMP 位图<br/>(BmpDemo 演示)"]
Check -->|"GIF 动图"| GifPath["解析/转换 GIF 帧<br/>(GifDemo 演示)"]
BmpPath --> Fit["按设备屏幕参数裁剪/缩放"]
GifPath --> Fit
Fit --> Encode["编码为设备端字节流"]
Encode --> Send["经 JL 蓝牙协议下发"]
Send --> Device["设备屏幕显示"]
Device --> End([结束])
关键点:
- 源格式解码:Android 侧使用系统解码能力将 PNG/JPEG/GIF 解析为
Bitmap或帧序列; - 目标格式选择:BMP 适合静态图片(表盘、头像),GIF 适合动态内容;
- 尺寸适配:设备屏幕分辨率有限,转换前需按目标尺寸缩放,避免带宽与设备内存浪费;
- 字节流下发:转换结果需按 JL 协议封包后走蓝牙通道,失败重传由协议层负责(详见相关页)。
使用示例
演示入口文件
两个演示类的完整实现位于 btsmart 模块测试源码集:
- BmpDemo.java:BMP 格式转换演示;
- GifDemo.java:GIF 动图转换演示。
No code example available:本次编写时源读取预算已用尽,未能读取上述文件正文,因此无法提供经过核实的代码摘录。请直接打开上方源码链接查看实际实现,切勿根据本页描述臆造 API。
如何运行演示
依据 src/test/java 的目录约定,两个演示类属于 JVM/设备端测试用例,可通过 Android Studio 的单元测试运行器直接执行 BmpDemo / GifDemo 的测试方法;具体入口方法名需查看源码确认(未验证)。
配置选项
由于本能力以演示代码(demo/convert)形式存在,未发现独立的配置类或配置文件。与格式转换相关的参数通常以方法参数/常量形式出现,常见于 JL SDK 的设备协议与图片工具类中:
| 选项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| 目标图片宽度/高度 | int | 取决于设备屏幕 | 转换前需按设备屏幕分辨率缩放 |
| 位图位深 | int | 24(RGB888) | BMP 每像素位数,与设备显示能力相关 |
| GIF 帧率/帧数 | int | 按源动图 | 动图转换时需保留帧间隔信息 |
| 颜色格式 | enum/int | 未验证 | RGB565 / ARGB8888 等,影响设备解码 |
以上参数为 JL 设备显示场景的常规约束,具体默认值与取值需以设备协议文档及源码为准(未验证)。
API 参考
未验证:本次未能读取 BmpDemo.java / GifDemo.java 正文,无法给出经过核实的类签名、方法参数与返回值。请以仓库源码为权威依据:
不提供臆造的签名,避免误导调用方。
失败模式、边界情况与并发
基于 Android 图片处理与 JL 蓝牙链路的通用约束,以下是该能力需要处理的典型风险点(部分内容为工程经验推断,需结合源码确认):
- 超大图片 OOM:高分辨率 PNG/JPEG 直接解码可能触发
OutOfMemoryError,转换前应使用BitmapFactory.Options.inSampleSize采样或按目标尺寸缩放; - 不支持的颜色格式:设备若仅支持 RGB565,直接下发 ARGB8888 数据可能导致花屏,转换时必须显式指定位深;
- GIF 帧解析失败:损坏或不完整的 GIF 源文件会导致帧序列解析中断,需对每帧解码结果判空;
- 蓝牙传输中断:转换后的位图字节流较大,下发过程中断需要协议层支持断点重传,或拆分数据包;
- 并发转换:若在正式业务中多线程并发转换并复用
Bitmap,需注意位图回收(recycle())与线程安全;演示代码通常为单线程,不存在该问题。
性能与运维注意事项
- 格式转换是 CPU 密集型操作,应在后台线程执行,避免阻塞 UI 线程(
BmpDemo/GifDemo作为测试示例未体现线程策略,正式实现需自行处理); - BMP 为未压缩格式,转换结果体积远大于源文件,下发前务必按设备屏幕尺寸裁剪,否则会显著增加蓝牙传输耗时;
- 动图转换(GIF)需要逐帧处理,帧数越多耗时越长,建议对动图做帧数上限控制。
扩展点
- 新增格式支持:若需支持 WebP、PNG 位图等新格式,可在
demo/convert包同级的工具类中新增转换方法,输出统一的设备字节流格式; - 复用转换结果:转换产物可作为
byte[]缓存或写入本地文件,避免重复转换,降低耗时与功耗; - 接入正式业务:将演示代码中的转换逻辑抽取为工具类并补充异常处理、尺寸适配与线程池调度后,即可接入表盘设置、头像同步等正式功能。
测试
demo/convert 下的 BmpDemo.java 与 GifDemo.java 即本能力的测试/演示用例,位于 src/test/java,说明:
- 转换逻辑以可运行示例形式验证,便于手动比对转换前后效果;
- 测试源码集不随正式 APK 打包,验证完成即可作为开发参考保留。
更完整的自动化单元测试(如像素级校验、边界尺寸用例)未在本次检索范围内发现,建议补充。
相关链接
- BmpDemo.java — BMP 格式转换演示
- GifDemo.java — GIF 动图转换演示
- IntArrayConverter.java — Room 持久化层的类型转换器(相邻主题,非本页范围)
- 蓝牙协议下发与设备端显示链路:参见协议/设备相关目录页
- 表盘与主题设置:参见对应功能页