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

相关推荐
youyin2 天前
HarmonyOS ArkUI 组件与自定义组件零基础:从搭页面到组件化开发
华为·harmonyos
HwJack202 天前
【HarmonyOS开发小实践】ArkTS 从 TypeScript 到方舟语言的演进
华为·harmonyos
威哥爱编程2 天前
HarmonyOS 7 星盾机密风控实战:设备风险因子端侧融合计算,可用不可见
harmonyos·arkts
威哥爱编程2 天前
HarmonyOS 7 应用快启实战:关键资源预加载进内存,冷启告别白屏
华为·harmonyos·arkts
马剑威(威哥爱编程)2 天前
【共创稿事节】HarmonyOS 7 视觉 AI 进阶实战:人脸检测 + 通用文字识别(OCR)两步接入
华为·harmonyos·arkts
HMS Core3 天前
HarmonyOS智慧多窗,让应用在任意窗口都“恰到好处”
harmonyos
梦想不只是梦与想3 天前
鸿蒙 应用发布准备工作(一)
harmonyos·鸿蒙上架·鸿蒙应用发布
马剑威(威哥爱编程)3 天前
【共创稿事节】HarmonyOS 7 文搜图实战:自然语言检索本地图片,全流程端侧闭环
华为·harmonyos
李游Leo3 天前
HarmonyOS 7 HAR + HSP 工程化实战:模块复用、包体积控制与依赖边界
harmonyos