请教下HarmonyOS Next选择相册的图片后,返回了图片的uri,我该如何根据uri将图片转为base64?

如题:HarmonyOS 选择相册的图片后,返回了图片的uri,我该如何根据uri将图片转为base64

阅读 1.2k
avatarAI BotBETA

在HarmonyOS中,将图片URI转换为Base64字符串通常涉及以下几个步骤:

  1. 使用MediaStoreImagePicker(取决于你的API)获取图片的URI。
  2. 使用MediaStoreImages.Media.getBitmap()(对于Android兼容性API)或HarmonyOS特定的API(如ImageDecoder)来获取图片的Bitmap对象。
  3. Bitmap对象转换成字节数组。
  4. 将字节数组编码成Base64字符串。

由于HarmonyOS是基于OpenHarmony和HarmonyOS SDK,这里给出一个基于通用Android API(因为HarmonyOS兼容Android)和可能适用于HarmonyOS环境的示例代码。请注意,直接针对HarmonyOS的特定API(如ImageDecoder)可能有所不同,但基本思路相同。

示例代码

这里是一个简化的示例,展示如何将图片URI转换为Base64字符串:

import ohos.media.common.ImageDecoder;
import ohos.media.image.Bitmap;
import ohos.media.image.BitmapFactory;

import java.io.ByteArrayOutputStream;
import java.io.IOException;

public String convertUriToBase64(String imageUri) {
    Bitmap bitmap = null;
    try {
        // 注意:这里的实现可能需要根据你的HarmonyOS SDK版本或API进行调整
        // 如果是HarmonyOS SDK,你可能需要使用ImageDecoder或其他API来获取Bitmap
        // 这里假设使用BitmapFactory作为示例(对于Android兼容性API)
        // 在HarmonyOS中,你可能需要类似但不同的API
        // bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(Uri.parse(imageUri)));

        // 对于HarmonyOS特有的API,示例如下(假设存在这样的API,实际情况可能不同)
        // ImageDecoder.Source source = ImageDecoder.createSource(context.getContentResolver(), Uri.parse(imageUri));
        // bitmap = ImageDecoder.decodeBitmap(source);

        // 这里只是示例,你需要根据你的实际API进行调整

        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream);
        byte[] byteArray = byteArrayOutputStream.toByteArray();

        return Base64.encodeToString(byteArray, Base64.DEFAULT);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        // 释放bitmap资源,防止内存泄漏
        if (bitmap != null && !bitmap.isRecycled()) {
            bitmap.recycle();
        }
    }
    return null;
}

// 注意:上述代码中的Base64.encodeToString是Android中的方法,HarmonyOS中可能需要你引入相应的库或API

注意

  • 上述代码中的BitmapFactory.decodeStream()Base64.encodeToString()是Android API中的方法。在HarmonyOS中,你可能需要使用HarmonyOS SDK提供的对应API,如ImageDecoder来解码图片,以及可能需要使用Java自带的java.util.Base64类或其他第三方库来编码Base64字符串。
  • 确保在使用完Bitmap后调用recycle()方法,以避免内存泄漏。
  • 根据你的HarmonyOS SDK版本和API可用性,上述代码可能需要相应的调整。
2 个回答

可参考如下转换例子:

let packOpts: image.PackingOption = { format: "image/jpeg", quality: 98 }; 
let imagePackerApi = image.createImagePacker(); 
 
const context: Context = getContext(this); 
const resourceMgr = context.resourceManager; 
let imageBuffer = await resourceMgr.getMediaContent($r('app.media.ic_low')); 
const imageSource: image.ImageSource = image.createImageSource(imageBuffer.buffer); 
let decodingOptions: image.DecodingOptions = { 
  editable: true, 
  desiredPixelFormat: 3, 
  rotate: 90 
} 
// 创建pixelMap并进行简单的旋转和缩放 
 
imageSource.createPixelMap(decodingOptions).then((pixelMap: PixelMap) => { 
 
  this.pixelMap = pixelMap 
  // pixelmap 转base64 先要有一个packing的过程 
  imagePackerApi.packing(pixelMap, packOpts).then((data: ArrayBuffer) => { 
    let base64Str = buffer.from(data).toString('base64') 
    let resultBase64Str = "data:image/png;base64," + base64Str 
    this.resultBase64Str = resultBase64Str 
  }).catch((error: BusinessError) => { 
    console.error('Failed to pack the image. And the error is: ' + error); 
  }) 
  pixelMap.release(); 
}) 
//重点提示: pixelmap转base64 不能直接转,先要加一个packing的过程,下面的方法是一个错误的实例,转出来的base64字符串不对。 
 
let pixelMap = await imageSource.createPixelMap(opts); 
console.log("pixelMap.getPixelBytesNumber():" + pixelMap.getPixelBytesNumber()) 
let arrayBuffer = new ArrayBuffer(pixelMap.getPixelBytesNumber()); 
pixelMap.readPixelsToBuffer(arrayBuffer) 
console.log("arrayBuffer" + arrayBuffer) 
let base64Str = buffer.from(arrayBuffer).toString(Constants.BASE_64); 
let resultBase64Str = "data:image/png;base64," + base64Str

在HarmonyOS中,要将相册选择的图片URI转为Base64,需要读取图片文件到ArrayBuffer然后使用Base64编码函数进行转换。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题