HarmonyOS APP 跳转相册 /相机, 选择照片后,返回uris, 怎么读取出来?

​APP 跳转相册, 选择1张照片,(用户可选择原图 / 非原图), 然后在返回内容,读取到arraybuffer。(目的是上传文件到服务器)

我通过如下的代码获取到uris。​

let photoPicker = new picker.PhotoViewPicker(); 
photoPicker.select(options).then((photo: picker.PhotoSelectResult) => { 
  // 怎么从photo.uris 读取数据到arraybuffer 
}
  • 1.
  • 2.
  • 3.
  • 4.

​但接下来, 通过fs 读取arraybuffer, 提示Error: Operation not permitted。

查看文档:

一种是申请ohos.permission.READ_IMAGEVIDEO, 但这个不是normal权限了。

一种是通过phAccessHelper.getAssets(fetchOption), 但取到的是缩略图。

两种方案都不适合我需要的场景。 希望能够获取(用户选择的原图 / 非原图)。​

HarmonyOS
2024-11-13 11:00:30
浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
zbw_apple

可以参考以下demo:

selectedPhoto() { 
  const photoSelectOptions = new photoAccessHelper.PhotoSelectOptions(); 
  photoSelectOptions.MIMEType = photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE; // 过滤选择媒体文件类型为VIDEO 
  photoSelectOptions.maxSelectNumber = 1; // 选择媒体文件的最大数目 
  let uris: Array<string> = []; 
  const photoViewPicker = new photoAccessHelper.PhotoViewPicker(); 
  photoViewPicker.select(photoSelectOptions).then(async (photoSelectResult: photoAccessHelper.PhotoSelectResult) => { 
    uris = photoSelectResult.photoUris; 
    console.info('photoViewPicker.select to file succeed and uris are:' + uris); 
    let file = fs.openSync(uris[0], fs.OpenMode.READ_ONLY); 
    console.info('file fd:' + file.fd); 
    const imageSource: image.ImageSource = image.createImageSource(file.fd); 
    let decodingOptions: image.DecodingOptions = { 
      editable: true, 
      desiredPixelFormat: 3, 
    } 
    let selectedImgPixelMap = await imageSource.createPixelMap(decodingOptions); 
    let imageBuffer = await this.packingPixelMap2Jpg(selectedImgPixelMap) 
    console.log('ArrayBuffer = ' + imageBuffer.byteLength) 
 
  }).catch((err: BusinessError) => { 
    console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`); 
  }) 
} 
 
// 打包 PixelMap 为 jpg 格式 
async packingPixelMap2Jpg(pixelMap: PixelMap): Promise<ArrayBuffer> { 
  // 创建ImagePacker实例 
  const imagePackerApi = image.createImagePacker(); 
  // 设置打包参数 
  // format:图片打包格式,只支持 jpg 和 webp 
  // quality:JPEG 编码输出图片质量 
  // bufferSize:图片大小,默认 10M 
  const packOpts: image.PackingOption = { format: "image/jpeg", quality: 100 }; 
  let imageBuffer: ArrayBuffer = new ArrayBuffer(1); 
  try { 
  // 图片压缩或重新打包 
  imageBuffer = await imagePackerApi.packing(pixelMap, packOpts); 
} catch (err) { 
  console.error(`Invoke packingPixelMap2Jpg failed, err: ${JSON.stringify(err)}`); 
} 
return imageBuffer; 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
分享
微博
QQ
微信
回复
2024-11-13 16:10:04
相关问题
选择相册怎么等待返回啊?
2688浏览 • 1回复 待解决
HarmonyOS 相机拍照完,照片读取失败
701浏览 • 1回复 待解决
HarmonyOS 相册相机选择组件
948浏览 • 1回复 待解决
HarmonyOS 相机拍照和选择相册功能demo
678浏览 • 1回复 待解决
HarmonyOS 手机的照片怎么传送出来
944浏览 • 1回复 待解决