当前位置: 首页 > news >正文

实战:HarmonyOS 中 HEIF 图像开发全流程(图处理篇)

紧接着上篇文章。我们继续HarmonyOS 中 HEIF 图像开发全流程。这篇主要记录如何进行图处理。

实战 :HEIF 图像自定义处理(进阶场景)

这里还是说一下环境吧。

环境要求

  • HarmonyOS 版本:需基于 HarmonyOS 5.0 及以上(HEIF 解码性能优化、硬件编码支持均从 5.0 开始)。
  • 开发工具:DevEco Studio 5.0 及以上(确保 ArkUI 组件与 Image Kit API 兼容)。
  • 测试设备:搭载 HarmonyOS 5.x 的真机或模拟器(部分硬件解码能力需真机支持)。
  • 图像资源:准备 1-2 张 HEIF 格式图片(后缀通常为 .heif 或 .heic,可通过手机拍摄或在线工具转换获取),并放入项目的 main_pages/images 目录下(需在 module.json5 中配置资源路径)。

在项目中,我们若需对 HEIF 图像进行 旋转、裁剪、滤镜 等后处理,需先通过 Image Kit 将 HEIF 解码为 PixelMap(像素数据),处理完成后再传给 Image 组件渲染。

1. 场景需求

加载一张 HEIF 格式的人物照片,先将其顺时针旋转 90 度,再裁剪为 200x200 的正方形,最后显示在页面中。

2. 操作步骤

步骤 1:解码 HEIF 为 PixelMap

通过 image.createImageSource() 创建图像源,再调用 createPixelMapSync() 解码为 PixelMap,同时指定解码参数(如像素格式、是否可编辑):

import image from '@ohos.multimedia.image';
import { Column, Image, Text, FlexAlign, WidthPercent, Button } from '@ohos/ui';@Entry
@Component
struct HEIFProcessPage {// 定义变量存储 PixelMap(处理后的图像像素数据)private processedPixelMap: image.PixelMap | null = null;// 页面加载时执行解码与处理aboutToAppear() {this.decodeAndProcessHEIF();}// 核心方法:解码 HEIF 并进行旋转、裁剪处理async decodeAndProcessHEIF() {try {// 1. 创建 HEIF 图像源(从资源文件读取)const imageSource = image.createImageSource($r('app.image.person').uri);// 2. 配置解码选项:指定可编辑、像素格式(RGBA_8888 支持透明通道)const decodeOpts: image.DecodingOptions = {editable: true,                // 必须设为 true,否则无法后续处理desiredPixelFormat: image.PixelMapFormat.RGBA_8888,desiredSize: { width: 400, height: 400 }  // 预指定解码尺寸,减少内存占用};// 3. 解码为 PixelMaplet pixelMap = await imageSource.createPixelMap(decodeOpts);// 4. 后处理 1:顺时针旋转 90 度pixelMap = await pixelMap.rotate(90);  // 支持 0/90/180/270 度// 5. 后处理 2:裁剪为 200x200 正方形(左上角坐标 (100,100),宽高 200)const cropOpts: image.CropOptions = {x: 100,y: 100,width: 200,height: 200};pixelMap = await pixelMap.crop(cropOpts);// 6. 存储处理后的 PixelMap,用于页面渲染this.processedPixelMap = pixelMap;// 7. 释放原始图像源(避免内存泄漏)imageSource.release();} catch (err) {console.error('HEIF 解码/处理失败:', err);}}build() {Column({ space: 20, alignItems: FlexAlign.Center }) {Text('HEIF 图像自定义处理(旋转+裁剪)').fontSize(24).fontWeight(FontWeight.Bold);// 显示处理后的图像if (this.processedPixelMap) {Image(this.processedPixelMap).width(200).height(200).borderRadius(8);} else {// 加载中提示Text('处理中...').fontSize(16);}}.padding(20).width('100%').height('100%');}
}

步骤 2:运行测试

  1. 将 person.heic 图片放入资源目录,确保解码参数中的 desiredSize 不小于裁剪尺寸(避免裁剪区域超出图像范围)。
  2. 运行应用,观察页面:加载完成后应显示 “旋转 90 度 + 裁剪后” 的正方形图像,无拉伸或变形。

3. 关键注意点

  • editable 必须为 true:若需对 PixelMap 进行旋转、裁剪,解码时需将 editable 设为 true,否则会抛出 “不可编辑” 异常。
  • 内存管理:解码后的 imageSource 与临时 pixelMap 需及时调用 release() 释放,避免内存泄漏。
  • 尺寸适配desiredSize 建议设为 “略大于最终显示尺寸”,既减少解码耗时,又避免后续处理时图像质量损失。

文章转载自:

http://YdO1TrfI.hfxks.cn
http://yjATLEE3.hfxks.cn
http://hBUZXy61.hfxks.cn
http://w40a05YT.hfxks.cn
http://4snkr09A.hfxks.cn
http://eoBnyt0l.hfxks.cn
http://HDmQFM76.hfxks.cn
http://aThtp6VK.hfxks.cn
http://qvUy5nTS.hfxks.cn
http://iJmuWuvL.hfxks.cn
http://3DA8lo5w.hfxks.cn
http://KQIrULW5.hfxks.cn
http://9vF2I3F4.hfxks.cn
http://Mq38HYms.hfxks.cn
http://LlkcQWjQ.hfxks.cn
http://MtSjVFSk.hfxks.cn
http://R96GleFz.hfxks.cn
http://2qNbSGMr.hfxks.cn
http://FrLuXgoT.hfxks.cn
http://RPBP3zKv.hfxks.cn
http://USyeUlJV.hfxks.cn
http://y2bDXZIP.hfxks.cn
http://C4S3WJQp.hfxks.cn
http://Bs1nOuf4.hfxks.cn
http://H8YXSnFp.hfxks.cn
http://7ZxmFJoS.hfxks.cn
http://pI19UFFY.hfxks.cn
http://RJ6YgX97.hfxks.cn
http://4NCESRd1.hfxks.cn
http://psgCZdOR.hfxks.cn
http://www.dtcms.com/a/374682.html

相关文章:

  • 深入 Kubernetes:从零到生产的工程实践与原理洞察
  • 在Ubuntu上修改Nginx的默认端口(例如从80端口改为其他端口,如8080)
  • 《用 Pandas 和 Matplotlib 绘制柱状图:从数据读取到可视化表达的实战指南》
  • python之socket网络编程
  • 【用与非门设计一个七段显示译码器,要求显示Y, E, S 三个符号+门电路符号逻辑式】2022-12-5
  • 解决 Ubuntu 25.04 下 make menuconfig 报 ncurses 错误的问题
  • (49)es容器化部署启动报错-RBAC权限问题
  • MacOS 运行CosyVoice
  • Adam优化算法:深度学习的自适应动量估计方法
  • macos deepctr_torch虚拟环境配置
  • react的filber架构
  • Spring框架事件驱动架构核心注解之@EventListener
  • ARM的big.LITTLE架构
  • 整体设计 之 绪 思维导图引擎 :思维价值链分层评估的 思维引导和提示词导航 之 引 认知系统 之8 之 序 认知元架构 之3(豆包助手 之5)
  • 飞算JavaAI全链路实战:智能构建高可用电商系统核心架构
  • 01-AI-神经网络-视觉-PaddleDetection交通信号灯的目标检测的模型训练(平台提供的数据集)
  • SpringBoot改造MCP服务器(StreamableHTTP)
  • Gradle 与 Android 构建缓存机制全面总结
  • 数据结构题集-第四章-串-采用特定数据类型对串求逆
  • 新能源汽车中维修开关有什么作用?
  • GitHub 热榜项目 - 日榜(2025-09-09)
  • Go 装饰器模式学习文档
  • 20.44 QLoRA调参秘籍:零成本实现7B模型微调,参数黄金配比全解析(附3090实战方案)
  • Ubuntu 22.04 安装 Docker Compose 最新最简单完整指南​
  • 网络原理——传输层协议UDP
  • 从Java全栈开发到云原生实践:一次真实面试的深度剖析
  • 更换libc.so导致linux变砖,通过LD_PRELOAD挽救
  • PySpark数据输出
  • 面试题:MySQL要点总结(基础)
  • net::ERR_EMPTY_RESPONSE