【仓颉三方库】图像处理库 —— 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

相关推荐
行者9611 分钟前
Flutter与OpenHarmony深度集成:数据导出组件的实战优化与性能提升
flutter·harmonyos·鸿蒙
小雨下雨的雨13 分钟前
Flutter 框架跨平台鸿蒙开发 —— Row & Column 布局之轴线控制艺术
flutter·华为·交互·harmonyos·鸿蒙系统
小雨下雨的雨1 小时前
Flutter 框架跨平台鸿蒙开发 —— Center 控件之完美居中之道
flutter·ui·华为·harmonyos·鸿蒙
小雨下雨的雨1 小时前
Flutter 框架跨平台鸿蒙开发 —— Icon 控件之图标交互美学
flutter·华为·交互·harmonyos·鸿蒙系统
小雨下雨的雨2 小时前
Flutter 框架跨平台鸿蒙开发 —— Placeholder 控件之布局雏形美学
flutter·ui·华为·harmonyos·鸿蒙系统
行者962 小时前
OpenHarmony Flutter弹出菜单组件深度实践:从基础到高级的完整指南
flutter·harmonyos·鸿蒙
小雨下雨的雨3 小时前
Flutter 框架跨平台鸿蒙开发 —— Padding 控件之空间呼吸艺术
flutter·ui·华为·harmonyos·鸿蒙系统
行者963 小时前
Flutter到OpenHarmony:横竖屏自适应布局深度实践
flutter·harmonyos·鸿蒙
小雨下雨的雨3 小时前
Flutter 框架跨平台鸿蒙开发 —— Align 控件之精准定位美学
flutter·ui·华为·harmonyos·鸿蒙
行者964 小时前
Flutter与OpenHarmony集成:跨平台开关组件的实践与优化
flutter·harmonyos·鸿蒙