HarmonyOS鸿蒙Next中如何将拍照或者相册的图片压缩并转化base64格式

HarmonyOS鸿蒙Next中如何将拍照或者相册的图片压缩并转化base64格式 如何将拍照或者相册的图片压缩并转化base64格式

3 回复

您好,这个demo是拉起相机然后拍照保存到指定的目录,然后转为base64的整个流程

import picker from '@ohos.multimedia.cameraPicker'
import camera from '@ohos.multimedia.camera';
import common from '@ohos.app.ability.common';
import { BusinessError } from '@ohos.base';
import fileuri from '@ohos.file.fileuri';
import fs from '@ohos.file.fs';
import { buffer } from '@kit.ArkTS';
import { image } from '@kit.ImageKit';

let mContext = getContext(this) as common.Context;
class CameraPosition {
  cameraPosition : camera.CameraPosition
  saveUri :string
  constructor(cameraPosition : camera.CameraPosition,saveUri:string) {
    this.cameraPosition = cameraPosition
    this.saveUri = saveUri
  }
}
let pathDir = getContext().filesDir;
let filePath = pathDir + `${new Date().getTime()}.jpg`
fs.createRandomAccessFileSync(filePath, fs.OpenMode.CREATE);
let uri = fileuri.getUriFromPath(filePath);
async function demo() {
  try {
    let pickerProfile = new CameraPosition(camera.CameraPosition.CAMERA_POSITION_BACK,uri)
    //前置摄像机传CAMERA_POSITION_FRONT,后置摄像机传CAMERA_POSITION_BACK,saveuri传想存到对应沙箱的uri
    let pickerResult: picker.PickerResult = await picker.pick(mContext, [picker.PickerMediaType.PHOTO, picker.PickerMediaType.VIDEO], pickerProfile);
    console.log("the pick pickerResult is:" + JSON.stringify(pickerResult));
  } catch (error) {
    let err = error as BusinessError;
    console.error(`the pick call failed. error code: ${err.code}`);
  }
}

@Entry
@Component struct Photopage{
  @State base64Str:string = ''
  async getImageBase64WithUri(uri:string): Promise<string> {
    const file = await fs.open(uri, fs.OpenMode.READ_ONLY);
    const imageSource : image.ImageSource = image.createImageSource(file.fd);
    const imagePackerApi = image.createImagePacker();
    // 设置打包参数
    // format:当前仅支持打包为JPEG、WebP 和 png 格式
    // quality:JPEG 编码输出图片质量
    // bufferSize:图片大小,默认 10M
    const packOpts: image.PackingOption = { format: "image/jpeg", quality: 100 };
    let imageBuffer: ArrayBuffer = new ArrayBuffer(1);
    let resultBase64Str = ''
    try {
      // 图片压缩或重新打包
      imageBuffer = await imagePackerApi.packing(imageSource, packOpts);
      let base64Str = buffer.from(imageBuffer).toString('base64')
      resultBase64Str="data:image/jpeg;base64,"+base64Str

    } catch (err) {
      console.error(`Invoke getImageArrayBufferWithUri failed, err: ${JSON.stringify(err)}`);
    }
    return resultBase64Str;
  }

  build(){
    Row(){
      Column(){
        Button('拉起后置摄像头').margin({bottom:20}).onClick(() =>{ demo() })
        Button('uri转为base64').onClick(async () =>{
          this.base64Str = await this.getImageBase64WithUri(uri)
        })
        Image(this.base64Str)
          .width(300)
          .height(400)
      }
    }

  }
}

更多关于HarmonyOS鸿蒙Next中如何将拍照或者相册的图片压缩并转化base64格式的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,要将拍照或相册中的图片压缩并转换为Base64格式,可以使用Imageutil模块。首先,通过Image模块加载图片,然后使用Image.Packer进行压缩。接着,使用util.base64将压缩后的图片数据转换为Base64格式。以下是关键代码示例:

import image from '@ohos.multimedia.image';
import util from '@ohos.util';

// 加载图片
let imageSource = image.createImageSource(/* 图片资源 */);
let imagePacker = image.createImagePacker();

// 设置压缩参数
let packOpts = {
  format: "image/jpeg",
  quality: 80
};

// 压缩图片
imagePacker.packing(imageSource, packOpts).then(data => {
  // 转换为Base64
  let base64 = util.base64EncodeSync(data);
  console.log(base64);
}).catch(error => {
  console.error("压缩或转换失败: " + error);
});

这段代码首先加载图片资源,然后通过ImagePacker进行压缩,最后使用util.base64EncodeSync将压缩后的图片数据转换为Base64格式。

在HarmonyOS Next中,你可以通过以下步骤将图片压缩并转换为Base64格式:

  1. 获取图片:从相机或相册获取图片,保存为PixelMap对象。
  2. 压缩图片:使用ImageSourceImagePacker进行图片压缩,设置压缩参数如质量、尺寸等。
  3. 转换为Base64:将压缩后的图片数据通过Base64Encoder转换为Base64字符串。

代码示例:

// 获取图片并压缩
ImageSource imageSource = ImageSource.create(uri, null);
ImagePacker packer = ImagePacker.create();
PackOptions options = new PackOptions.Builder().setQuality(50).build();
byte[] compressedImage = packer.pack(imageSource, options);

// 转换为Base64
String base64Image = Base64.encodeToString(compressedImage, Base64.DEFAULT);

确保在ohos.global.icu.utilohos.media.image中导入相关类。

回到顶部