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

鸿蒙:从相册中选取图片,并转成PixelMap作为UI显示

1、前言

PixelMap图像像素类,用于读取或写入图像数据以及获取图像信息。

2、参考文档

https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-image-pixelmaphttps://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-apis-image-pixelmaphttps://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-image-6https://developer.huawei.com/consumer/cn/doc/harmonyos-faqs/faqs-image-6

3、核心思路

1. 使用 photoPicker.select 拉起相册

2. 使用打开图片,获取文件描述符(fd)

3. 通过文件描述符创建图片源对象,用于后续图片解码

4、核心代码

 try {// 存储选中图片的URI数组let uris: Array<string> = [];// 创建相册选择配置对象let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();// 设置选择的文件类型为图片PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;// 设置最大选择数量为1张PhotoSelectOptions.maxSelectNumber = 1;// 创建相册选择器实例let photoPicker = new photoAccessHelper.PhotoViewPicker();// 调用选择器的select方法,打开系统相册选择图片photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {// 从选择结果中获取选中图片的URI列表uris = PhotoSelectResult.photoUris;// 以只读模式打开选中的图片文件,获取文件描述符(fd)// URI是图片在系统中的唯一标识,通过它可以访问文件let file = fileIo.openSync(uris[0], fileIo.OpenMode.READ_ONLY);console.info('文件描述符: ' + file.fd);// 通过文件描述符创建图片源对象,用于后续图片解码const imageSource: image.ImageSource = image.createImageSource(file.fd);// 定义图片解码选项let decodingOptions: image.DecodingOptions = {editable: true, // 允许对图片进行编辑操作desiredPixelFormat: 3 // 设置期望的像素格式(3通常表示RGBA8888格式)}// 从图片源创建像素映射(PixelMap)// 异步操作,通过回调返回结果imageSource.createPixelMap(decodingOptions, (err: BusinessError, pixelMap: image.PixelMap) => {if (err !== undefined) {// 若创建失败,打印错误信息console.error(`创建PixelMap失败,错误码: ${err.code}, 错误信息: ${err.message}`);} else {// 若创建成功,更新状态变量,触发UI刷新显示图片this.pixelMap = pixelMap;console.info('PixelMap创建成功');}})}).catch((err: BusinessError) => {// 捕获相册选择过程中的异常console.error(`相册选择失败,错误码: ${err.code}, 错误信息: ${err.message}`);})} catch (error) {// 捕获其他可能的异常(如文件操作失败等)let err: BusinessError = error as BusinessError;console.error('图片选择流程异常: ' + JSON.stringify(err));}

5、运行效果

6、完整代码

Index.ets

import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { image } from '@kit.ImageKit';
import { fileIo } from '@kit.CoreFileKit';@Entry
@ComponentV2
struct Index {// 定义状态变量,用于存储图片的像素映射对象,控制图片显示// pixelMap是图片在内存中的像素表示,可直接用于Image组件显示@Local pixelMap: image.PixelMap | undefined = undefinedbuild() {// 垂直布局容器,子组件间距为10vpColumn({ space: 10 }) {// 图片显示组件,根据pixelMap状态变量显示图片Image(this.pixelMap).width("80%") // 图片宽度占父容器的80%// 选择图片按钮,点击触发图片选择逻辑Button('选择图片').onClick(() => {try {// 存储选中图片的URI数组let uris: Array<string> = [];// 创建相册选择配置对象let PhotoSelectOptions = new photoAccessHelper.PhotoSelectOptions();// 设置选择的文件类型为图片PhotoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE;// 设置最大选择数量为1张PhotoSelectOptions.maxSelectNumber = 1;// 创建相册选择器实例let photoPicker = new photoAccessHelper.PhotoViewPicker();// 调用选择器的select方法,打开系统相册选择图片photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {// 从选择结果中获取选中图片的URI列表uris = PhotoSelectResult.photoUris;// 以只读模式打开选中的图片文件,获取文件描述符(fd)// URI是图片在系统中的唯一标识,通过它可以访问文件let file = fileIo.openSync(uris[0], fileIo.OpenMode.READ_ONLY);console.info('文件描述符: ' + file.fd);// 通过文件描述符创建图片源对象,用于后续图片解码const imageSource: image.ImageSource = image.createImageSource(file.fd);// 定义图片解码选项let decodingOptions: image.DecodingOptions = {editable: true, // 允许对图片进行编辑操作desiredPixelFormat: 3 // 设置期望的像素格式(3通常表示RGBA8888格式)}// 从图片源创建像素映射(PixelMap)// 异步操作,通过回调返回结果imageSource.createPixelMap(decodingOptions, (err: BusinessError, pixelMap: image.PixelMap) => {if (err !== undefined) {// 若创建失败,打印错误信息console.error(`创建PixelMap失败,错误码: ${err.code}, 错误信息: ${err.message}`);} else {// 若创建成功,更新状态变量,触发UI刷新显示图片this.pixelMap = pixelMap;console.info('PixelMap创建成功');}})}).catch((err: BusinessError) => {// 捕获相册选择过程中的异常console.error(`相册选择失败,错误码: ${err.code}, 错误信息: ${err.message}`);})} catch (error) {// 捕获其他可能的异常(如文件操作失败等)let err: BusinessError = error as BusinessError;console.error('图片选择流程异常: ' + JSON.stringify(err));}})}// 容器宽度和高度占满整个屏幕.width("100%").height("100%")}
}

感觉有帮助,可以点赞或收藏

http://www.dtcms.com/a/466745.html

相关文章:

  • 什么是网站什么是网址东莞网站设计服务商
  • STM32 读取引脚状态 -按键输入
  • 关于网站建设分类名字logo设计在线生成免费
  • 网站的二级网页关键词在线一键生成网页
  • 深圳夫博网站建设有限公司深夜的fm免费看
  • MySQL学习笔记09:MySQL高级特性深度学习(上):count函数、数据类型与分库分表核心原理
  • 失智老年人照护实训室建设指南:从意义到实践的全面解析
  • 10分钟上手OpenAI Agents SDK
  • 中文分析原始
  • JP4-8-MyLesson前台前端(二)
  • 做js题目的网站上海网站建设公司推荐排名
  • 网站建设效益分析代运营合同模板
  • 京东商品关键字搜索接口深度开发:从精准检索到商业机会挖掘的技术实现
  • 怎么看网站开发的发展wordpress能开发app
  • 项目学习总结:LVGL图形参数动态变化、开发板的GDB调试、sqlite3移植、MQTT协议、心跳包
  • 统一高效图像生成与编辑!百度新加坡国立提出Query-Kontext,多项任务“反杀”专用模型
  • 网站建设要那些东西适合个人开店的外贸平台
  • window安装wsl
  • 命题逻辑基础,形式系统,定理证明(二)
  • 如何利用数字源表进行纳米材料电特性表征?
  • 网络层协议之ICMP协议
  • 怎样做自己的网站钻钱宁波seo怎么选
  • skynet debug_console控制台中debug指令使用
  • 做棋盘游戏辅助的网站python和php做网站
  • 如何查看局域网内IP冲突问题?如何查看局域网IP环绕问题?arp -a命令如何使用?
  • 网站建设成都市南京做网站公司哪家好
  • 做电影视频网站赚钱嘛网站制作公司杭州
  • 建站平台哪个最好网站建设需要什么技术
  • 网页制作与网站建设实战大全pdf做网站的分辨率要多大
  • 主动学习:用“聪明提问”提升模型效率的迭代艺术