鸿蒙开发中快速获取相册图片的缩略图

开发背景

在日常开发中,常见选择图库照片,或者视频,进行列表显示。例如微信朋友圈9宫格,相册等。该情况下,一般都是加载图片的缩略图。点击item后加载图片跟视频详情。

技术方案

1、直接获取pixmap

javascript 复制代码
async function getThumbnail(phAccessHelper: photoAccessHelper.PhotoAccessHelper) {
  let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
  let fetchOptions: photoAccessHelper.FetchOptions = {
    fetchColumns: [],
    predicates: predicates
  };

  try {
    let fetchResult: photoAccessHelper.FetchResult<photoAccessHelper.PhotoAsset> = await phAccessHelper.getAssets(fetchOptions);
    let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
    console.info('getAssets photoAsset.displayName : ' + photoAsset.displayName);
    let size: image.Size = { width: 720, height: 720 }; // 控制缩略图显示大小
    let pixelMap: image.PixelMap =  await photoAsset.getThumbnail(size);
    let imageInfo: image.ImageInfo = await pixelMap.getImageInfo()
    console.info('getThumbnail successful, pixelMap ImageInfo size: ' + JSON.stringify(imageInfo.size));
    fetchResult.close();
  } catch (err) {
    console.error('getThumbnail failed with err: ' + err);
  }
}

该可以控制缩略图大小,获取的是pixelMap 需要单独处理下内存加载问题,不推荐在列表中显示

2、直接读取相册数据库中的图片的缩略图

typescript 复制代码
export function getThumbnailJpgURI(sourceUri:string,modifiedDate:number,path?:string) :string{
  return `${sourceUri}?timestampAPP=${modifiedDate}&oper=thumbnail&width=0&height=0&path=${path ?? ''}`;
}

该方案提供的缩略图uri 可以直接设置在Image组件中,读取的是图库数据库中的缩略图,所以不需要单独处理内存,较为推荐。ps:该方法中uri 不是图片的filepath,是图库提供的uri路径。只有保存在图库的图片或者视频才可以使用该方法。 uri例子:file://media/Photo/59/IMG_1761224543_046/IMG_046.webp 跟filepath不是一个东西

代码实现

index 页面

scss 复制代码
import { getImageUris, getThumbnailJpgURI, getVideoUris } from '../utils/ImageUtils';

@Entry
@Component
struct Index {
  @State @Watch('getImageUri') imgUri:string = ""
  @State @Watch('getVideoUri') videoUri:string = ""
  getImageUri() {
    console.log("lsk 图片uri"+this.imgUri)
  }
  getVideoUri() {
    console.log("lsk 视频uri"+this.imgUri)
  }
  build() {
    Column({ space: 10 }) {
      Row({space: 20}) {
     Column({space: 10}){
        Text("图片的缩略图").fontSize(15)
       // 图片的
       Image(this.imgUri?getThumbnailJpgURI(this.imgUri,new Date().getTime()):$r('app.media.default_picture'))
         .width(100)
         .aspectRatio(1)
         .objectFit(ImageFit.Cover)
     }
        Column({space: 10}){
          Text("视频的缩略图").fontSize(15)
          // 图片的
          Image(this.videoUri?getThumbnailJpgURI(this.videoUri,new Date().getTime()):$r('app.media.default_video'))
            .width(100)
            .aspectRatio(1)
            .objectFit(ImageFit.Cover)
        }
      }
      Button('获取图片uri').width('80%').height(40).onClick(async () => {
        getImageUris((uris) => {
          if (uris.length >= 0) {
            this.imgUri = uris[0]
          }
     })
      })
        .margin({top: 30})
      Button('获取视频uri').width('80%').height(40).onClick(async () => {
        getVideoUris((uris) => {
          if (uris.length >= 0) {
            this.videoUri = uris[0]
          }
     })
      })
    }
    .justifyContent(FlexAlign.Center)
    .height('100%')
    .width('100%')
  }
}

ImageUtil 代码

ini 复制代码
/**
 * 获取图片的uris
 * @returns
 */
export  function getImageUris(callback:(uris:string[])=>void): void {
  const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
  photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为IMAGE。
  photoSelectOptions.maxSelectNumber = 100; // 选择媒体文件的最大数目。
  let uris: Array<string> = [];
  const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
  photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
    uris = photoSelectResult.photoUris;
    callback(uris);
    console.info('lsk photo  uris:' + uris);
  }).catch((err: BusinessError) => {
    console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
  })
}

```
/**
 * 获取视频的uris
 * @returns
 */
export  function getVideoUris(callback:(uris:string[])=>void) {
  const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
  photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.VIDEO_TYPE; // 过滤选择媒体文件类型为IMAGE。
  photoSelectOptions.maxSelectNumber = 100; // 选择媒体文件的最大数目。
  let uris: Array<string> = [];
  const photoViewPicker = new photoAccessHelper.PhotoViewPicker();
  photoViewPicker.select(photoSelectOptions).then((photoSelectResult: photoAccessHelper.PhotoSelectResult) => {
    uris = photoSelectResult.photoUris;
    callback(uris);
  }).catch((err: BusinessError) => {
    console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
  })
}

/**
 * 获取缩略图uri
 */
export function getThumbnailJpgURI(sourceUri:string,modifiedDate:number,path?:string) :string{
  return `${sourceUri}?timestampAPP=${modifiedDate}&oper=thumbnail&width=0&height=0&path=${path ?? ''}`;
}
```

demo 显示图

相关推荐
lili-felicity3 小时前
React Native 鸿蒙跨平台开发:LayoutAnimation 实现鸿蒙端按钮点击的缩放反馈动画
react native·react.js·harmonyos
哈__5 小时前
React Native 鸿蒙跨平台开发:Dimensions 屏幕尺寸获取
react native·华为·harmonyos
奋斗的小青年!!5 小时前
Flutter跨平台开发适配OpenHarmony:手势识别实战应用
flutter·harmonyos·鸿蒙
搬砖的kk6 小时前
Cordova 适配鸿蒙系统(OpenHarmony) 全解析:技术方案、环境搭建与实战开发
华为·开源·harmonyos
不爱吃糖的程序媛6 小时前
OpenHarmony 通用C/C++三方库 标准化鸿蒙化适配
c语言·c++·harmonyos
程序猿追6 小时前
鸿蒙PC应用开发深度实战:一次开发、多端适配的沉浸式音乐播放器迁移实践
华为·harmonyos
行者967 小时前
Flutter跨平台开发:安全检测组件适配OpenHarmony
flutter·harmonyos·鸿蒙
小雨下雨的雨8 小时前
Flutter 框架跨平台鸿蒙开发 —— GridView 控件之多维网格美学
flutter·华为·交互·harmonyos·鸿蒙系统
小雨下雨的雨9 小时前
Flutter跨平台开发实战: 鸿蒙与循环交互艺术:无限循环的 Banner 引擎
flutter·ui·华为·交互·harmonyos·鸿蒙系统
奋斗的小青年!!9 小时前
Flutter与鸿蒙深度融合:打造物理引擎驱动的3D卡片交互体验
flutter·3d·harmonyos·鸿蒙