HarmonyOS 用picker选择图片后压缩并转成base64字符串

需要用picker选择图片后压缩并转成base64字符串,有没相关的实例代码

HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
aquaa

关于图片压缩可以使用ImagePacker,参考官方文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-image-V5

参考以下链接实现: https://gitee.com/harmonyos-cases/cases/blob/master/CommonAppDevelopment/feature/imagecompression/src/main/ets/view/ImageCompression.ets

转成base64可以参考如下demo:

import fs from '@ohos.file.fs';
import buffer from '@ohos.buffer';

/**
 * 图片转base64
 *
 * @param filePath 文件路径
 * @param bufferLen
 * @returns base64
 */
export function imageToBase64(filePath: string, bufferLen = 409600) {
  try {
    const file = fs.openSync(filePath, fs.OpenMode.READ_WRITE);
    const arrayBuffer = new ArrayBuffer(bufferLen);
    const readLen = fs.readSync(file.fd, arrayBuffer);
    const buf = buffer.from(arrayBuffer, 0, readLen);
    const base64 = buf.toString('base64');
    fs.closeSync(file);
    return base64;
  } catch (e) {
    console.error('file err:', JSON.stringify(e));
    return ''
  }
}

根据picker返回uri创建imagesource:

Image(this.pixelMap).width(200).height(200)
Button('打开相册')
  .onClick(() => {
    //创建图库选择器对象实例
    const photoViewPicker =new photoAccessHelper.PhotoViewPicker();
    //调用select()接口拉起图库界面进行文件选择,文件选择成功后,返回PhotoSelectResult结果集
    photoViewPicker.select().then(async (photoSelectResult: picker.PhotoSelectResult) => {
      //用一个全局变量存储返回的uri
      selectUris = photoSelectResult.photoUris;
      console.info('photoViewPicker.select to file succeed and uris are:' + selectUris);
    }).catch((err: BusinessError) => {
      console.error(`Invoke photoViewPicker.select failed, code is ${err.code}, message is ${err.message}`);
    })
  })
Button('creatPixelMap')
  .margin({ top: 5 })
  .onClick((event: ClickEvent) => {
    //使用fs.openSync接口,通过uri打开这个文件得到fd
    let file = fs.openSync(selectUris[0], fs.OpenMode.READ_ONLY);
    console.info('file fd: ' + file.fd);
    //根据文件fd创建imagSource
    const imageSource: image.ImageSource = image.createImageSource(file.fd);
    //完成后关闭fd
    fs.closeSync(file);

  });

})

imagesource编码,再转base64:

imagePackerApi.packing(this.imagesource, packOpts).then(async (data: ArrayBuffer) => {
  // data 为打包获取到的文件流,写入文件保存即可得到一张图片

  if (data) {

    let buf: buffer.Buffer = buffer.from(data);
    let baseStr: string = buf.toString('base64', 0, buf.length);

    console.log('66666' + JSON.stringify(baseStr))
    //送显
    this.imgStr = "data:image/jpeg;base64," + baseStr;
  }
}).catch((error: BusinessError) => {
  console.error('Failed to pack the image. And the error is: ' + error);
})
分享
微博
QQ
微信
回复
1天前
相关问题
HarmonyOS 图片转为base64字符
208浏览 • 1回复 待解决
base64字符如何转为图片并保存
2709浏览 • 1回复 待解决
如何将PixelMap转图片base64字符
549浏览 • 1回复 待解决
如何将图片base64字符转PixelMap?
636浏览 • 1回复 待解决
base64字符保存为图片的方法
908浏览 • 1回复 待解决
HarmonyOS 如何将图片压缩并转成base64
32浏览 • 1回复 待解决
PixelMap类型怎么转换成Base64字符
661浏览 • 1回复 待解决
HarmonyOS SM2加签返回Base64字符
70浏览 • 1回复 待解决
HarmonyOS 图片压缩图片base64
341浏览 • 1回复 待解决