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

发布于 1周前 作者 caililin 来自 鸿蒙OS

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

2 回复

拉起相机拍照保存到指定的目录,然后转为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鸿蒙系统中,将拍照或相册的图片压缩并转化为Base64格式,可以通过以下步骤实现:

首先,获取图片数据。这可以通过拍照或从相册选择图片来完成。拍照功能通常涉及调用相机API,而选择图片则可能涉及访问存储权限和相册API。

接着,对图片进行压缩。HarmonyOS提供了多种图像处理方式,你可以使用BitmapFactory解码图片,并通过设置inSampleSize参数来实现压缩。请注意,压缩过程可能会影响图片质量,因此需要权衡压缩率和图片清晰度。

然后,将压缩后的图片数据转化为字节数组。这可以通过调用图片的toByteArray方法来实现。

最后,将字节数组编码为Base64格式。HarmonyOS提供了Base64编码的API,你可以使用这些API将字节数组转换为Base64字符串。

示例代码如下(注意:具体实现可能因版本和API差异而有所不同):

// 伪代码,具体实现需根据HarmonyOS API调整
Bitmap bitmap = // 获取并压缩后的Bitmap对象
ByteArrayOutputStream baos = new ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.JPEG, quality, baos) // quality为压缩质量
byte[] byteArray = baos.toByteArray()
String base64 = Base64.encodeToString(byteArray, Base64.DEFAULT)

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部