首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

鸿蒙HarmonyOS开发实战—多媒体开发(图像开发 一)

  • 25-02-22 03:41
  • 3945
  • 11228
blog.csdn.net

图像开发概述

HarmonyOS图像模块支持图像业务的开发,常见功能如图像解码、图像编码、基本的位图操作、图像编辑等。当然,也支持通过接口组合来实现更复杂的图像处理逻辑。

基本概念
  • 图像解码 图像解码就是不同的存档格式图片(如JPEG、PNG等)解码为无压缩的位图格式,以方便在应用或者系统中进行相应的处理。
  • PixelMap PixelMap是图像解码后无压缩的位图格式,用于图像显示或者进一步的处理。
  • 渐进式解码 渐进式解码是在无法一次性提供完整图像文件数据的场景下,随着图像文件数据的逐步增加,通过多次增量解码逐步完成图像解码的模式。
  • 预乘 预乘时,RGB各通道的值被替换为原始值乘以Alpha通道不透明的比例(0~1)后的值,方便后期直接合成叠加;不预乘指RGB各通道的数值是图像的原始值,与Alpha通道的值无关。
  • 图像编码 图像编码就是将无压缩的位图格式,编码成不同格式的存档格式图片(JPEG、PNG等),以方便在应用或者系统中进行相应的处理。
约束与限制

为及时释放本地资源,建议在图像解码的ImageSource对象、位图图像PixelMap对象或图像编码的ImagePacker对象使用完成后,主动调用ImageSource、PixelMap和ImagePacker的release()方法。

图像解码开发

场景介绍

图像解码就是将所支持格式的存档图片解码成统一的PixelMap图像,用于后续图像显示或其他处理,比如旋转、缩放、裁剪等。当前支持格式包括JPEG、PNG、GIF、HEIF、WebP、BMP。

接口说明

ImageSource主要用于图像解码。

接口名

描述

create(String pathName, SourceOptions opts)

从图像文件路径创建图像数据源。

create(InputStream is, SourceOptions opts)

从输入流创建图像数据源。

create(byte[] data, SourceOptions opts)

从字节数组创建图像源。

create(byte[] data, int offset, int length, SourceOptions opts)

从字节数组指定范围创建图像源。

create(File file, SourceOptions opts)

从文件对象创建图像数据源。

create(FileDescriptor fd, SourceOptions opts)

从文件描述符创建图像数据源。

createIncrementalSource(SourceOptions opts)

创建渐进式图像数据源。

createIncrementalSource(IncrementalSourceOptions opts)

创建渐进式图像数据源,支持设置渐进式数据更新模式。

createPixelmap(DecodingOptions opts)

从图像数据源解码并创建PixelMap图像。

createPixelmap(int index, DecodingOptions opts)

从图像数据源解码并创建PixelMap图像,如果图像数据源支持多张图片的话,支持指定图像索引。

updateData(byte[] data, boolean isFinal)

更新渐进式图像源数据。

updateData(byte[] data, int offset, int length, boolean isFinal)

更新渐进式图像源数据,支持设置输入数据的有效数据范围。

getImageInfo()

获取图像基本信息。

getImageInfo(int index)

根据特定的索引获取图像基本信息。

getSourceInfo()

获取图像源信息。

release()

释放对象关联的本地资源。

普通解码开发步骤

1. 创建图像数据源ImageSource对象,可以通过SourceOptions指定数据源的格式信息,此格式信息仅为给解码器的提示,正确提供能帮助提高解码效率,如果不设置或设置不正确,会自动检测正确的图像格式。不使用该选项时,可以将create接口传入的SourceOptions设置为null。

  1. ImageSource.SourceOptions srcOpts = new ImageSource.SourceOptions();
  2. srcOpts.formatHint = "image/png";
  3. // 此处传入用户自定义的图像路径
  4. String pathName = "/sdcard/image.png";
  5. ImageSource imageSource = ImageSource.create(pathName, srcOpts);

  1. // 不通过SourceOptions指定数据源格式信息
  2. ImageSource imageSourceNoOptions = ImageSource.create(pathName, null);

2. 设置解码参数,解码获取PixelMap图像对象,解码过程中同时支持图像处理操作。

  • 设置desiredSize支持按尺寸缩放,如果设置为全0,则不进行缩放。
  • 设置desiredRegion支持按矩形区域裁剪,如果设置为全0,则不进行裁剪。
  • 设置rotateDegrees支持旋转角度,以图像中心点顺时针旋转。

如果只需要解码原始图像,不使用该选项时,可将给createPixelMap传入的DecodingOptions 设置为null。

  1. // 普通解码叠加缩放、裁剪、旋转
  2. ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions();
  3. decodingOpts.desiredSize = new Size(100, 2000);
  4. decodingOpts.desiredRegion = new Rect(0, 0, 100, 100);
  5. decodingOpts.rotateDegrees = 90;
  6. PixelMap pixelMap = imageSource.createPixelmap(decodingOpts);
  1. // 普通解码
  2. PixelMap pixelMapNoOptions = imageSource.createPixelmap(null);

3. 解码完成获取到PixelMap对象后,可以进行后续处理,比如渲染显示等。

渐进式解码开发步骤

1. 创建渐进式图像数据源ImageSource对象。

可以通过SourceOptions指定数据源的格式信息,此格式信息仅为提示,如果填写不正确,会自动检测正确的图像格式。使用IncrementalSourceOptions指定图像数据的更新方式为渐进式更新。

  1. ImageSource.SourceOptions srcOpts = new ImageSource.SourceOptions();
  2. srcOpts.formatHint = "image/jpeg";
  3. ImageSource.IncrementalSourceOptions incOpts = new ImageSource.IncrementalSourceOptions();
  4. incOpts.opts = srcOpts;
  5. incOpts.mode = ImageSource.UpdateMode.INCREMENTAL_DATA;
  6. ImageSource imageSource = ImageSource.createIncrementalSource(incOpts);

2. 渐进式更新数据。在未获取到全部图像时,支持先更新部分数据来尝试解码,调用updateData更新数据,将参数isFinal设置为false;当获取到全部数据后,最后一次更新数据时设置isFinal为true,表示数据更新完毕。设置解码参数同普通解码。

  1. // 传入本地图片路径作为图像数据源
  2. File file = new File("/sdcard/test.jpg");
  3. FileInputStream fis = null;
  4. try {
  5. fis = new FileInputStream(file);
  6. ByteArrayOutputStream bos = new ByteArrayOutputStream();
  7. byte[] data = new byte[1024];
  8. int len = -1;
  9. while((len = fis.read(data)) != -1) {
  10. bos.write(data, 0, len);
  11. }
  12. byte[] fileByte = bos.toByteArray();
  13. // 获取到一定的数据时尝试解码
  14. imageSource.updateData(fileByte, 0, fileByte.length / 2, false);
  15. ImageSource.DecodingOptions decodingOpts = new ImageSource.DecodingOptions();
  16. PixelMap pixelMap = imageSource.createPixelmap(decodingOpts);
  17. // 更新数据再次解码,重复调用直到数据全部更新完成
  18. imageSource.updateData(fileByte, fileByte.length / 2, fileByte.length / 4, false);
  19. pixelMap = imageSource.createPixelmap(decodingOpts);
  20. // 数据全部更新完成时需要传入isFinal为true
  21. imageSource.updateData(fileByte, fileByte.length * 3 / 4, fileByte.length / 4, true);
  22. pixelMap = imageSource.createPixelmap(decodingOpts);
  23. } catch (IOException e) {
  24. e.printStackTrace();
  25. }

3. 解码完成获取到PixelMap对象后,可以进行后续处理,比如渲染显示等。


最后,为了能让大家更好的去学习提升鸿蒙 (Harmony OS) 开发技术,小编连夜整理了一份30个G纯血版学习资料(含视频、电子书、学习文档等)以及一份在Github上持续爆火霸榜的《纯血版华为鸿蒙 (Harmony OS)开发手册》(共计890页),希望对大家有所帮助。

纯血版鸿蒙 HarmonyOS 4.0 视频学习资料

 需要以上视频学习资料小伙伴

请点击→纯血版全套鸿蒙HarmonyOS学习资料


《纯血版华为鸿蒙 (Harmony OS)开发手册》

这份手册涵盖了当前鸿蒙 (Harmony OS) 开发技术必掌握的核心知识点

纯血版鸿蒙 (Harmony OS)开发手册部分精彩内容

HarmonyOS 概念:

  • 系统定义
  • 技术架构
  • 技术特性
  • 系统安全

如何快速入门?

  • 基本概念
  • 构建第一个ArkTS应用
  • 构建第一个JS应用
  • ……


开发基础知识: 

  • 应用基础知识
  • 配置文件
  • 应用数据管理
  • 应用安全管理
  • 应用隐私保护
  • 三方应用调用管控机制
  • 资源分类与访问
  • 学习ArkTS语言
  • ……

基于ArkTS 开发:

  • Ability开发
  • UI开发
  • 公共事件与通知
  • 窗口管理
  • 媒体
  • 安全
  • 网络与链接
  • 电话服务
  • 数据管理
  • 后台任务(Background Task)管理
  • 设备管理
  • 设备使用信息统计
  • DFX
  • 国际化开发
  • 折叠屏系列
  • .……

获取以上文中提到的这份纯血版鸿蒙 (Harmony OS) 开发资料的小伙伴 

请点击→纯血版全套鸿蒙HarmonyOS学习资料


?写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing?,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新VIP学习资料,请点击→纯血版全套鸿蒙HarmonyOS学习资料

最新鸿蒙Next全套学习资料请扫码
微信名片
注:本文转载自blog.csdn.net的蜀道山QAQ的文章"https://blog.csdn.net/shudaoshanQAQ/article/details/135698667"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top