HarmonyOS 鸿蒙Next怎样将 【相册中选中】或【相机拍摄】的图片转成Base64编码呢?

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

HarmonyOS 鸿蒙Next怎样将 【相册中选中】或【相机拍摄】的图片转成Base64编码呢? 怎样将 【相册中选中】或【相机拍摄】的图片转成Base64编码呢?

搜到一个同步方法 getMediaBase64ByNameSync ,可惜把 图片的uri 传给 fileName 参数 报错说无效。

14 回复

基本搞定 —— 但未测试将base64字符串解码成图像。

分两步:

1、设法读取文件内容:fs.readSync(file.fd, buf)

2、编码:new util.Base64Helper().encodeToStringSync(array, util.Type.MIME)

之前是因为【权限的原因】无法直接读取图片/文件内容,

采用的【折中方法】是将获取到的图片复制到沙盒中,从沙盒里读取就可以了。

感谢大家的帮助。

更多关于HarmonyOS 鸿蒙Next怎样将 【相册中选中】或【相机拍摄】的图片转成Base64编码呢?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你好,编码那部分的array参数是怎么来的,能贴一下代码嘛,

将沙盒中的图片生成PixelMap

export async function generatePixelMapWithImagePath(imgPath: string): Promise<image.PixelMap> {
  const imageSource: image.ImageSource = image.createImageSource(imgPath);
  let decodingOptions: image.DecodingOptions = {
    editable: true,
    desiredPixelFormat: 3,
  };
  try {
    const gPixelMap = await imageSource.createPixelMap(decodingOptions);
    console.log("Succeeded in creating PixelMap = ", gPixelMap);
    return gPixelMap;
  } catch (error) {
    console.error("Failed to create PixelMap");
    return Promise.reject(error);
  }
}

将指定的PixelMap转化为ArrayBuffer

export async function encodePixelMap2ImageArrayBuffer(aPixelMap:image.PixelMap): Promise<ArrayBuffer> {
  const imagePackerApi = image.createImagePacker();
  let packOpts: image.PackingOption = { format: "image/jpeg", quality: 80 };
  try {
    let data = await imagePackerApi.packing(aPixelMap, packOpts);
    console.info("PixelMap 2 ArrayBuffer = ", data.byteLength.toString());
    return data;
  } catch (error) {
    console.error('Failed to pack the image. And the error is: ' + JSON.stringify(error));
    return Promise.reject(error);
  }
}

export async function imageDataArrayBuffer2Base64(buf: ArrayBuffer, cardSide: number): Promise<string> { try { let array = new Uint8Array(buf.slice(0, buf.byteLength)); let result = new util.Base64Helper().encodeToStringSync(array, util.Type.MIME); return result; } catch (error) { console.info('born base64Str with error = ', JSON.stringify(error)); return Promise.reject(error); } }

我这边也解决了,你这个有点麻烦

filePath:沙河路径,type:图片类型

```javascript
static  imageFileToBase64(filePath:string,type:string) : string{
    let file = fs.openSync(filePath, fs.OpenMode.READ_ONLY);
    let stats = fs.statSync(file.fd)
    console.log('message file.fd = %ld', file.fd)
    console.log('message file.fd = %ld', stats.size)
    let buffer = new ArrayBuffer(stats.size)
    let readLen = fs.readSync(file.fd, buffer);
    console.info('readSync data to file succeed and buffer size is:' + readLen);
    fs.closeSync(file);
    let that = new util.Base64Helper();
    let array = new Uint8Array(buffer);
    let base64 = `data:image/${type};base64,` + that.encodeToStringSync(array,util.Type.BASIC);
    return base64
}

请问从相机实时预览获取的画面流获取jpeg然后base64编码有解决吗?

async (frame: image.Image) => {
  if (frame == undefined) {
    return;
  }

  let imgComponent = await frame.getComponent(image.ComponentType.JPEG);
  let jpegData = imgComponent.byteBuffer as ArrayBuffer;
  let array = new Uint8Array(jpegData.slice(0, jpegData.byteLength));
  let that = new util.Base64Helper();
  let base64Str = 'data:image/jpeg;base64,' + that.encodeToStringSync(array, util.Type.BASIC);
  console.info("base64: " + base64Str);
}

这种方式编码出来的无法还原打开成图片呢

需要首先转化为pixelMap。后来测试过了,可以还原成图片,不过我这种方法有点啰嗦。

获取到的图片如何添加一个时间水印?

这个应该是使用画布相关的接口了吧,没尝试过。

把图片读完扔给canvas,canvas调toDataUrl

这个方案试一下?

希望HarmonyOS能加强与其他品牌设备的兼容性,让更多人受益。

下面 都是有关Base64编码相关的帖子, 希望能找到一点线索

https://developer.huawei.com/consumer/cn/doc/search?val=Base64%E7%BC%96%E7%A0%81&type=forum

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

大家也都是在找办法,今晚试了一晚上,但还没解决。

在HarmonyOS(鸿蒙)系统中,将相册中选中的图片或相机拍摄的图片转为Base64编码,可以通过以下步骤实现:

  1. 获取图片数据:

    • 如果是从相册中选择图片,可以使用鸿蒙系统提供的文件选择器API来获取图片的URI。
    • 如果是相机拍摄,则在拍摄完成后会获得图片的存储路径或URI。
  2. 读取图片文件:

    • 使用File类或相关API根据图片的URI或路径读取图片文件,将其转换为字节数组。
  3. 编码为Base64:

    • 鸿蒙系统提供了Base64编码的API,可以使用这些API将字节数组编码为Base64字符串。

示例代码(伪代码,具体实现需根据鸿蒙API调整):

// 假设图片数据已读取到byte[] imageData中
String base64EncodedString = Base64.encodeToString(imageData, Base64.DEFAULT);

注意:上述代码中的Base64.encodeToString仅为示例,鸿蒙系统中可能使用不同的API进行Base64编码,请查阅鸿蒙官方文档获取准确方法。

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

回到顶部