鸿蒙媒体开发系列15——图片解码(PixcelMap)

如果你也对鸿蒙开发感兴趣,加入"Harmony自习室"吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。

1、概述

应用开发中的图片开发是对图片像素数据进行解析、处理、构造的过程,达到目标图片效果,主要涉及图片解码、图片处理、图片编码等。

在学习图片开发前,需要熟悉以下基本概念。

  • 图片解码

    指将所支持格式的存档图片解码成统一的PixelMap,以便在应用或系统中进行图片显示或图片处理。当前支持的存档图片格式包括JPEG、PNG、GIF、RAW、WebP、BMP、SVG。

  • PixelMap

    指图片解码后无压缩的位图,用于图片显示或图片处理。

  • 图片处理

    指对PixelMap进行相关的操作,如旋转、缩放、设置透明度、获取图片信息、读写像素数据等。

  • 图片编码

    指将PixelMap编码成不同格式的存档图片(当前仅支持JPEG和WebP),用于后续处理,如保存、传输等。

图片开发的主要流程如下图所示。

  1. **获取图片:**通过应用沙箱等方式获取原始图片。

  2. **创建ImageSource实例:**ImageSource是图片解码出来的图片源类,用于获取或修改图片相关信息。

  3. **图片解码:**通过ImageSource解码生成PixelMap。

  4. **图片处理:**对PixelMap进行处理,更改图片属性实现图片的旋转、缩放、裁剪等效果。然后通过Image组件显示图片。

  5. **图片编码:**使用图片打包器类ImagePacker,将PixelMap或ImageSource进行压缩编码,生成一张新的图片。

我们先讨论图片解码(把图片转换成PixcelMap对象)。

2、图片解码

图片解码指将所支持格式的存档图片解码成统一的PixelMap,以便在应用或系统中进行图片显示或图片处理。当前支持的存档图片格式包括JPEG、PNG、GIF、RAW、WebP、BMP、SVG。

2.1、开发步骤

a)全局导入Image模块。

复制代码
import image from '@ohos.multimedia.image';

b)获取图片

👉🏻 方法一:获取沙箱路径。

复制代码
const context = getContext(this);const filePath = context.cacheDir + '/test.jpg';

*👉🏻 方法二:通过沙箱路径获取图片的文件描述符。*​​​​​​​

复制代码
import fs from '@ohos.file.fs';// ... const context = getContext(this);const filePath = context.cacheDir + '/test.jpg';const file = fs.openSync(filePath, fs.OpenMode.READ_WRITE);const fd = file?.fd;

👉🏻 方法三:通过资源管理器获取资源文件的ArrayBuffer​​​​​​​

复制代码
const context = getContext(this);// 获取resourceManager资源管理器const resourceMgr = context.resourceManager;const fileData = await resourceMgr.getRawFileContent('test.jpg');// 获取图片的ArrayBufferconst buffer = fileData.buffer;

c)创建ImageSource实例

*👉🏻 方法一:通过沙箱路径创建ImageSource。*​​​​​​​

复制代码
// 获取文件路径const context = getContext(this);const filePath = context.cacheDir + '/test.jpg';// 创建实例const imageSource = image.createImageSource(filePath);

👉🏻 方法二:通过文件描述符fd创建ImageSource。​​​​​​​

复制代码
const context = getContext(this);const filePath = context.cacheDir + '/test.jpg';const file = fs.openSync(filePath, fs.OpenMode.READ_WRITE);const fd = file?.fd;// fd为已获得的文件描述符const imageSource = image.createImageSource(fd);

👉🏻 方法三:通过资源管理器获取资源文件的ArrayBuffer​​​​​​​

复制代码
const context = getContext(this);// 获取resourceManager资源管理器const resourceMgr = context.resourceManager;const fileData = await resourceMgr.getRawFileContent('test.jpg');// 获取图片的ArrayBufferconst buffer = fileData.buffer;
const imageSource = image.createImageSource(buffer);

**d)设置解码参数DecodingOptions,解码获取PixelMap图片对象。**​​​​​​​

复制代码
let decodingOptions = {    editable: true,    desiredPixelFormat: 3,}// 创建pixelMap并进行简单的旋转和缩放 const pixelMap = await imageSource.createPixelMap(decodingOptions);

3、demo

对资源文件中的图片进行编码​​​​​​​

复制代码
// 1. 获取ResourceManager资源管理const context = getContext(this);// 获取resourceManager资源管理const resourceMgr = context.resourceManager;
// 2. 获取rawFile文件夹下test.jpg的ArrayBufferconst fileData = await resourceMgr.getRawFileContent('test.jpg');// 获取图片的ArrayBufferconst buffer = fileData.buffer;
// 3. 创建imageSourceconst imageSource = image.createImageSource(buffer);
// 4. 创建PixelMapconst pixelMap = await imageSource.createPixelMap();
相关推荐
左手厨刀右手茼蒿9 小时前
Flutter 三方库 firebase_admin 跨云边管线企业级鸿蒙管控底座适配风云:无障碍贯穿服务器授权防火墙打通底层生态授权域并构建海量设备推送集结-适配鸿蒙 HarmonyOS ohos
服务器·flutter·harmonyos
钛态9 小时前
Flutter for OpenHarmony:shelf_web_socket 快速构建 WebSocket 服务端,实现端到端实时通信(WebSocket 服务器) 深度解析与鸿蒙适配指南
服务器·前端·websocket·flutter·华为·性能优化·harmonyos
亚历克斯神9 小时前
Flutter 三方库 at_server_status 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、透明、实时的 @protocol 去中心化身份服务器状态感知与鉴权监控引擎
flutter·华为·harmonyos
木易 士心9 小时前
TypeScript 与 ArkTS 全面对比:鸿蒙生态下的语言演进
typescript·harmonyos
XHW___0019 小时前
鸿蒙音频通话应用后台保活与音频连续播放方案
华为·音视频·harmonyos
zzialx11 小时前
HarmonyOS:照片添加多样式的水印信息
华为·harmonyos
左手厨刀右手茼蒿11 小时前
Flutter 三方库 k_m_logic 的鸿蒙化适配指南 - 构建声明式的业务逻辑状态机、助力鸿蒙端复杂交互流程的解耦与重构
flutter·harmonyos·鸿蒙·openharmony·k_m_logic
钛态11 小时前
Flutter 三方库 result_type 深入鸿蒙强类型返回栈跨界交互适配:肃清空指针回调与运行时崩溃、大幅增注接口安全壁垒且提升多隔离桥接数据抛出健壮性-适配鸿蒙 HarmonyOS ohos
flutter·交互·harmonyos
lxysbly11 小时前
鸿蒙街机模拟器app下载
华为·harmonyos