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

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

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

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

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

查看文档:

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

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

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

HarmonyOS
3天前
浏览
收藏 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; 
}
分享
微博
QQ
微信
回复
3天前
相关问题
选择相册怎么等待返回啊?
1946浏览 • 1回复 待解决
HarmonyOS 手机的照片怎么传送出来
152浏览 • 1回复 待解决
如何从app跳转到系统相机
5344浏览 • 1回复 已解决
鸿蒙怎么跳转进入email 选择
7189浏览 • 1回复 待解决
怎么跳转打开其他app
8576浏览 • 1回复 待解决
HarmonyOS app怎么跳转到系统设置?
291浏览 • 1回复 待解决