HarmonyOS 开发-图片选择和下载保存案例

news/2024/7/21 12:32:45 标签: harmonyos, 华为, 鸿蒙开发, 移动开发, ArkTS

介绍

本示例介绍图片相关场景的使用:包含访问手机相册图片、选择预览图片并显示选择的图片到当前页面,下载并保存网络图片到手机相册或到指定用户目录两个场景。

效果图预览

使用说明

  1. 从主页通用场景集里选择图片选择和下载保存进入首页。
  2. 分两个场景
  • 点击“+”进入”访问手机相册图片预览并选择”场景示例。
  • 点击上部“下载”按钮进入”下载网络图片到手机相册”场景示例;点击下部“下载到指定路径”按钮进入”下载文件到指定用户目录”场景示例。

实现思路

场景1:访问手机相册图片预览并选择

通过photoViewPicker.select()拉起图库界面,用户可以预览并选择一个或多个文件,即可实现拉起手机相册并进行图片的预览与选择。

  1. 创建文件类型为图片的,并最大预览数量为2的图库实例。
async getFileAssetsFromType(){
  const photoSelectOptions = new picker.PhotoSelectOptions(); // 创建图库对象实例
  photoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE; // 选择媒体文件类型为Image
  photoSelectOptions.maxSelectNumber = 2; // 选择媒体文件的最大数目
 }
  1. 通过photoViewPicker.select()接口,通过传入参数PhotoSaveOptions图库对象,获取返回的用户选择的图片信息。
  async getFileAssetsFromType(){  
    photoViewPicker.select(photoSelectOptions)
      .then((photoSelectResult) => { 
        this.uris = photoSelectResult.photoUris; // select返回的uri权限是只读权限,需要将uri写入全局变量@State中即可根据结果集中的uri进行读取文件数据操作。
      })
      .catch((err: BusinessError) => {
       console.info('Invoke photoViewPicker.select failed, code is ${err.code},message is ${err.message}');
      })
  }
场景2:下载并保存网络图片
  1. 通过http中request方法获取在线图片数据。
http.createHttp()
  .request('https://gitee.com/openharmony/applications_app_samples/raw/master/code/Solutions/Shopping/OrangeShopping/feature/navigationHome/src/main/resources/base/media/product002.png',
    (error: BusinessError, data: http.HttpResponse) => {
      if (error) {
        promptAction.showToast({
          message: $r('app.string.image_request_fail'),
          duration: 2000
        })
        return
      }
      this.transcodePixelMap(data);
      if (data.result instanceof ArrayBuffer) {
        this.imageBuffer = data.result as ArrayBuffer;
      }
    })
  1. 使用createPixelMap方法将获取到的图片数据转换成pixelmap展示到页面中
// 将ArrayBuffer类型的图片装换为PixelMap类型
transcodePixelMap(data: http.HttpResponse) {
  let code: http.ResponseCode | number = data.responseCode;
  if (ResponseCode.ResponseCode.OK === code) {
    let imageData: ArrayBuffer = data.result as ArrayBuffer;
    let imageSource: image.ImageSource = image.createImageSource(imageData);

    class tmp {
      height: number = 100;
      width: number = 100;
    };

    let options: Record<string, number | boolean | tmp> = {
      'alphaType': 0, // 透明度
      'editable': false, // 是否可编辑
      'pixelFormat': 3, // 像素格式
      'scaleMode': 1, // 缩略值
      'size': { height: 100, width: 100 }
    }; // 创建图片大小

    imageSource.createPixelMap(options).then((pixelMap: PixelMap) => {
      this.image = pixelMap;
      this.isShow = true
    });
  }
}
  1. 将图片保存到图库或者用户选择的路径

    • 使用getPhotoAccessHelper、createAsset、fs.open、fs.write等接口将数据存到本地图库中
     async saveImage(buffer: ArrayBuffer | string): Promise<void> {
       let context = getContext(this) as common.UIAbilityContext;
       let helper = photoAccessHelper.getPhotoAccessHelper(context);
       let uri = await helper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg');
       let file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
       await fs.write(file.fd, buffer);
       await fs.close(file.fd);
     }
  • 使用photoViewPicker.save、fs.open、fs.write等接口将数据存到用户选择路径的数据库中
     async pickerSave(buffer: ArrayBuffer | string): Promise<void> {
       const photoSaveOptions = new picker.PhotoSaveOptions(); // 创建文件管理器保存选项实例
       photoSaveOptions.newFileNames = ['PhotoViewPicker ' + new Date().getTime() + 'jpg'] // 保存文件名(可选)
       const photoViewPicker = new picker.PhotoViewPicker;
       photoViewPicker.save(photoSaveOptions)
         .then(async (photoSvaeResult) => {
           console.info('PhotoViewPicker.save successfully,photoSvaeResult uri:' + JSON.stringify(photoSvaeResult));
           let uri = photoSvaeResult[0];
           let file = await fs.open(uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
           await fs.write(file.fd, buffer);
           await fs.close(file.fd);
           promptAction.showToast({
             message: $r('app.string.image_request_success'),
             duration: 2000
           })
         })
     }

高性能知识点

不涉及

工程结构&模块类型

   picturemanage                                   // har类型
   |---src/main/ets/components
   |   |---SelectPictures.ets                      // 场景一:访问手机相册图片预览并选择 
   |   |---SaveNetWorkPictures.ets                 // 场景二:下载网络图片并保存到手机相册或用户选择的文件夹
   |   |---PictureManage.ets                       // 视图层-主页面,三个场景入口

为了能让大家更好的学习鸿蒙(HarmonyOS NEXT)开发技术,这边特意整理了《鸿蒙开发学习手册》(共计890页),希望对大家有所帮助:https://qr21.cn/FV7h05

鸿蒙开发学习手册》:

如何快速入门:https://qr21.cn/FV7h05

  1. 基本概念
  2. 构建第一个ArkTS应用
  3. ……

开发基础知识:https://qr21.cn/FV7h05

  1. 应用基础知识
  2. 配置文件
  3. 应用数据管理
  4. 应用安全管理
  5. 应用隐私保护
  6. 三方应用调用管控机制
  7. 资源分类与访问
  8. 学习ArkTS语言
  9. ……

基于ArkTS 开发:https://qr21.cn/FV7h05

  1. Ability开发
  2. UI开发
  3. 公共事件与通知
  4. 窗口管理
  5. 媒体
  6. 安全
  7. 网络与链接
  8. 电话服务
  9. 数据管理
  10. 后台任务(Background Task)管理
  11. 设备管理
  12. 设备使用信息统计
  13. DFX
  14. 国际化开发
  15. 折叠屏系列
  16. ……

鸿蒙开发面试真题(含参考答案):https://qr18.cn/F781PH

鸿蒙开发面试大盘集篇(共计319页):https://qr18.cn/F781PH

1.项目开发必备面试题
2.性能优化方向
3.架构方向
4.
鸿蒙开发系统底层方向
5.鸿蒙音视频开发方向
6.鸿蒙车载开发方向
7.鸿蒙南向开发方向


http://www.niftyadmin.cn/n/5478354.html

相关文章

重磅来袭!2024CWE北京门窗幕墙展

CWE中国&#xff08;北京&#xff09;国际系统门窗及幕墙博览会 CWE China&#xff08;Beijing&#xff09;International System Doors Windows and Curtain Walls Expo 2024 年 8 月 29-31 日 北京&#xff0c;中国国际展览中心顺义馆 展会概况&#xff1a; 2024年CWE中国…

CLion图像调试方法研究

在windows下有vistual studio,针对opencv有image watch,在ubuntu下用Clion插件Image Watch要收费,遂研究OpenImageDebugger与CLion问题及在Clion中调试方法 1.Open Image Debugger Open Image Debugger is a tool for visualizing in-memory buffers during debug sessions…

二维相位解包裹理论算法和软件【全文翻译-质量引导路径跟踪(4.3)】

4.3 质量引导路径跟踪 在上一节中,我们研究了戈尔茨坦算法中的最近残差法将分支切口置于 "错误 "位置的例子。在本节中,我们将从一个完全不同的角度来探讨相位解包问题,提出以下问题: 在相位数据中,除了残差之外,是否还有其他信息可以用来指导整合路径? 将这…

JDK下载及安装说明

1&#xff0e;JDK下载 访问oracle官网&#xff1a;http://www.oracle.com 在首页点击Downloads&#xff0c;进入oracle软件下载页。 在下载页面&#xff0c;点击Java。 选择Java (JDK) for Developers&#xff0c;点击。 在 Java SE Downloads 页面&#xff0c;点击中间的DO…

【C语言】指针篇(指针数组,数组指针,函数指针,一级、二级指针)

文章目录 一、指针基础1.什么是指针2.指针的定义和初始化3.指针的解引用4.野指针和空指针5.指针的类型6.指针的大小7.指针的运算8.指针和数组9.指针和字符串10.二级指针 二、常量指针和指针常量三、指针数组和数组指针1.指针数组2.数组指针3.练习 四、数组传参和指针传参1.一维…

MYSQL 8.0版本修改用户密码(知道登录密码)和Sqlyog错误码2058一案

今天准备使用sqlyog连接一下我Linux上面的mysql数据库&#xff0c;然后就报如下错误 有一个简单的办法就是修改密码为password就完事!然后我就开始查找如何修改密码! 如果是需要解决Sqlyog错误码2058的话&#xff0c;执行以下命令&#xff0c;但是注意root对应host是不是loca…

PMP机构到底有多黑?劝你慎选!

没有尝试过多家机构的培训&#xff0c;那就根据我接受培训的机构模式来谈谈选择机构时应该注意的问题吧&#xff01;我报的是一门远程在线课程&#xff0c;因为考虑到省心省力这个因素&#xff0c;最初我就是决定报名的&#xff0c;最终在2018年3月那一期通过了5A考试。 第一&a…

lodash 使用

debounce / 防抖 用途 / Usage: 用于限制函数执行的频率&#xff0c;特别是在输入或搜索事件中。示例 / Code Example: import { debounce } from lodash;const handleSearch debounce(() > {// 在此处添加搜索逻辑 }, 500);解释 / Detailed Explanation: debounce 用于延…