【仓颉三方库】图像处理库 —— gifdrawable4cj

介绍

基于cangjie的GIF图像渲染库

特性

  • 🚀 支持播放GIF图片

  • 💪 支持控制GIF播放/暂停

  • 🛠️ 支持调节GIF播放速率

  • 🌍 支持设置显示大小

  • 💡 支持不同的拉伸类型

软件架构

架构图

GIF图片内部结构图(主要部分)

解析GIF图片流程图

源码目录

shell 复制代码
├─AppScope
├─doc
├─entry
│  └─src
│      └─main
│          ├─cangjie
│          └─resources
├─gifdrawable
│  └─src
│      └─main
│          ├─cangjie
│          │  └─src
│          │      ├─gifdisplay
│          │      ├─parser
│          │      ├─sparkmd5
│          │      └─utils
│          └─resources
└─hvigor
  • AppScope 全局资源存放目录和应用全局信息配置目录
  • doc API文档和使用手册存放目录
  • entry 工程模块 - 编译生成一个HAP
  • entry src APP代码目录
  • entry src main APP项目目录
  • entry src main cangjie 仓颉代码目录
  • entry src main resources 资源文件目录
  • gifdrawable 工程模块 - 编译生成一个har包
  • gifdrawable src 模块代码目录
  • gifdrawable src main 模块项目目录
  • gifdrawable src main cangjie 仓颉代码目录
  • gifdrawable src main resources 资源文件目录
  • gifdrawable src main cangjie src gifdisplay 组件主体代码目录
  • gifdrawable src main cangjie src parser 帧解码目录
  • gifdrawable src main cangjie src sparkmd5 文件哈希计算代码目录
  • gifdrawable src main cangjie src utils 解码工具目录
  • hvigor 构建工具目录

接口说明

主要类和函数接口说明详见 API

DD一下: 欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。

erlang 复制代码
`欢迎大家关注工粽号<程序猿百晓生>,可以了解到以下知识点。`
1.OpenHarmony开发基础
2.OpenHarmony北向开发环境搭建
3.鸿蒙南向开发环境的搭建
4.鸿蒙生态应用开发白皮书V2.0 & V3.0
5.鸿蒙开发面试真题(含参考答案) 
6.TypeScript入门学习手册
7.OpenHarmony 经典面试题(含参考答案)
8.OpenHarmony设备开发入门【最新版】
9.沉浸式剖析OpenHarmony源代码
10.系统定制指南
11.【OpenHarmony】Uboot 驱动加载流程
12.OpenHarmony构建系统--GN与子系统、部件、模块详解
13.ohos开机init启动流程
14.鸿蒙版性能优化指南
.......

使用说明

编译构建

通过module引入

  1. 克隆下载项目
  2. 将gifdrawable模块拷贝到应用项目下
  3. 修改自身应用 entry 下的 oh-package.json5 文件,在 dependencies 字段添加 "gifdrawable": "file:../gifdrawable"
cj 复制代码
{
    "name": "entry",
    "version": "1.0.0",
    "description": "Please describe the basic information.",
    "main": "",
    "author": "",
    "license": "",
    "dependencies": {
      "gifdrawable": "file:../gifdrawable"
    }
}
  1. 修改自身应用 entry/src/main/cangjie 下的 cjpm.toml 文件,在 [dependencies] 字段下添加 gifdrawable = {path = "../../../../gifdrawable/src/main/cangjie", version = "1.0.0"}
shell 复制代码
[dependencies]
  gifdrawable = {path = "../../../../gifdrawable/src/main/cangjie", version = "1.0.0"}
  1. 在项目中引用
cj 复制代码
import gifdrawable.gifdisplay.*
import gifdrawable.parser.*

功能示例

GIF动图数据解析 功能示例

  1. 在UI中添加GIFComponent组件,添加需要的变量
cj 复制代码
// 创建一个控制器保证GIFComponent初始化
@State var model: ControllerOptions = ControllerOptions()

// 是否自动播放
@State var gifAutoPlay: Bool = true

// 重置GIF播放,每次取反都能生效
@State var gifReset: Bool = false

// 绘制区域宽度
@State var compWidth: Float64 = 300.0

// 绘制区域高度
@State var compHeight: Float64 = 300.0

// 添加GIFComponent组件
GIFComponent(
    model: model,  // 控制器
    autoPlay: gifAutoPlay, // 自动播放标志
    resetGif: gifReset,  // 重置标志
    canvasWidth: compWidth,  // 绘制区域宽度
    canvasHeight: compHeight // 绘制区域高度
)
  1. 初始化控制器

注:这里新建控制器是方便数据处理后直接赋值给组件关联的初始化控制器,减少组件刷新次数

cj 复制代码
// 创建控制器
let modelx: ControllerOptions = ControllerOptions()

// 设置是否使用硬解码
modelx.setOpenHardware(true)

// 设置拉伸方式
modelx.setScaleType(ScaleType.FIT_CENTER)

// 设置速率
modelx.setSpeedFactor(1)

// 设置完成一次播放后的回调函数
modelx.setLoopFinish({loopTime: Option<Int64> => })
  1. 加载数据(三种方式)
cj 复制代码
// 读取工程内资源
let buffer: Array<UInt8> = ResourceLoader.loadMedia(UInt32(@r(app.media.xxx).id), globalAbilityContext)

// 读取沙箱路径下资源
let buffer: Array<UInt8> = ResourceLoader.loadRawFile("/data/storage/el2/base/files/xxx.gif")

// 下载网络资源
ResourceLoader.downloadDataWithContext(
    Model("网络资源地址"),  // 下载设置
    globalAbilityContext,  // AbilityContext
    {buffer: Array<Byte> => })},  // 下载成功并读取成Array<Byte>后回调函数
    { str: String => }) // 下载错误回调函数
  1. 数据转换成可显示内容
cj 复制代码
// 调用数据处理方法
modelx.loadBuffer(
    buffer, // 步骤3中获取的数据
    {error: Option<String> =>
        if (let Some(v) <- error) {
            // 错误信息处理
        } else {
            // 处理完成,开始显示
            gifAutoPlay = true
            // 将已完成数据处理的控制器赋值给组件关联的初始化控制器
            model = modelx
        }
    }
)

显示控制

cj 复制代码
// 开始
gifAutoPlay = true

// 暂停
gifAutoPlay = false

// 重置
gifReset = !gifReset

// 修改宽高
compWidth = 100.0
compHeight = 200.0

// 修改速率
model.setSpeedFactor(2)

// 修改拉伸方式
model.setScaleType(ScaleType.FIT_START)

约束与限制

在下述版本验证通过:

DevEco Studio: 5.0.3.500

Cangjie support Plugin: 5.0.3.500

相关推荐
nashane9 小时前
HarmonyOS 6学习:CapsLock键失效诊断与长截图完整实现指南
学习·华为·harmonyos
richard_yuu11 小时前
鸿蒙心理测评模块实战|PHQ-9/GAD7双量表答题、实时计分与结果本地化存储
华为·harmonyos
不爱吃糖的程序媛14 小时前
2026年Electron 鸿蒙PC环境搭建指南
人工智能·华为·harmonyos
nashane14 小时前
HarmonyOS 6学习:长截图功能开发中的滚动拼接与权限处理实战
人工智能·华为·harmonyos
大师兄666816 小时前
从零开发一个 HarmonyOS 输入法——KikaInputMethod 完整拆解
harmonyos·服务卡片·harmonyos6·formkit
Python私教21 小时前
鸿蒙 NEXT 也能接 MCP?用 ArkTS 跑通 AI Agent 工具链
人工智能·华为·harmonyos
Swift社区1 天前
分布式能力在鸿蒙 PC 上到底怎么用?
分布式·华为·harmonyos
nashane1 天前
HarmonyOS 6学习:外接键盘CapsLock与长截图功能的实战调试与完整解决方案
学习·华为·计算机外设·harmonyos
aqi002 天前
一文理清 HarmonyOS 6.0.2 涵盖的十个升级点
android·华为·harmonyos·鸿蒙·harmony