HarmonyOS 人脸识别后的PixelMap转base64后,后台接口和在线网站都无法解码出图片

一、人脸识别后,需要将返回的图片数据转换成base64返回给后台接口进行解码校验

目前返回的是解码失败

二、验证:使用在线网站进行图片编码解码,

https://base64.guru/converter/decode/image

1、上传本地图片可以编解码

2、使用人脸识别的结果进行解码,失败

3、将图片转换成BGRA格式,再转码

4、HarmonyOS端端解码并创建pixelmap,可以正常展示

三、需求:

怎样转换,才能让base64转换后的字符串可以正常解码获取到一张图片呢?

代码如下

this.faceLiveUtils.getDectionResultInfoPixelMap().then((pixelMap)=>{
  if(pixelMap){
    PhotoChangeUtils.pixelMapToArray(pixelMap).then((buffer)=>{
      //直接转码
      let base64 = PhotoChangeUtils.arrayToBase64(buffer);
      //将图片转换成BGRA格式,再转码
      let grbaBuffer = PhotoChangeUtils.rgba2BGRA(buffer);
      let headBase64 = PhotoChangeUtils.arrayToBase64(grbaBuffer);
      BioassayApiUtil.startFaceValid(2, this.realName, this.idCardNumber, headBase64);

      //解码并创建PixelMap
      let uint8Array:Uint8Array = new util.Base64Helper().decodeSync(headBase64);
      let arrayBuffer = uint8Array.buffer as ArrayBuffer;
      let imageInfo = pixelMap.getImageInfoSync();
      let w = imageInfo.size.width;
      let h = imageInfo.size.height;
      PhotoChangeUtils.arrayToPixelMap(arrayBuffer, w, h,
        (pixelMap)=>{
          this.pixelmap = pixelMap;
        })

    })

  }

})


async pixelMapToArray(pixelMap:PixelMap): Promise<ArrayBuffer>{
  //size为需要创建的像素buffer大小,取值为:height * width *4
  let size = pixelMap.getPixelBytesNumber();
  const readBuffer: ArrayBuffer = new ArrayBuffer(size);
  if (pixelMap) {
    await pixelMap.readPixelsToBuffer(readBuffer);
    let bufferSize = readBuffer.byteLength;
    PiccLog.info("bufferSize = " + bufferSize);
    return readBuffer;
  }
  return readBuffer;
}


arrayToPixelMap(readBuffer: ArrayBuffer | null, w:number, h:number, callback:(pixelMap:PixelMap)=>void){
  let opts: image.InitializationOptions = { editable: true, pixelFormat: image.PixelMapFormat.BGRA_8888,
    size: { height: h, width: w } }

  image.createPixelMap(readBuffer, opts).then((pixelMap)=>{
    callback(pixelMap);
  });

}

rgba2BGRA(data: ArrayBuffer): ArrayBuffer {
  let length: number = data.byteLength;
  let tempBuffer: ArrayBuffer = new ArrayBuffer(length);
  let rgbaData = new DataView(data);
  let bgraData = new DataView(tempBuffer);
  for (let i = 0; i < length; i += 4) {
    bgraData.setUint8(i, rgbaData.getUint8(i + 2));
    bgraData.setUint8(i + 1, rgbaData.getUint8(i + 1));
    bgraData.setUint8(i + 2, rgbaData.getUint8(i));
    bgraData.setUint8(i + 3, rgbaData.getUint8(i + 3));
  }
  return bgraData.buffer
}


arrayToBase64(data: ArrayBuffer){
  let buf: buffer.Buffer = buffer.from(data);
  // let base64 = 'data:image/jpeg;base64,' + buf.toString('base64', 0, buf.length);
  let base64 =  buf.toString('base64', 0, buf.length);
  return base64;
}
}
HarmonyOS
2024-12-25 08:27:10
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
put_get
分享
微博
QQ
微信
回复
2024-12-25 11:25:45
相关问题
怎么把PixelMap图片BASE64
9640浏览 • 1回复 待解决
HarmonyOS pixelMap怎么base64
52浏览 • 1回复 待解决
HarmonyOS 拍照图片base64
138浏览 • 1回复 待解决
PixelMap怎么Base64?(非Java)
3571浏览 • 2回复 待解决
HarmonyOS 图片base64
364浏览 • 1回复 待解决
HarmonyOS 图片base64乱码
240浏览 • 1回复 待解决
HarmonyOS 图片压缩和图片base64
524浏览 • 1回复 待解决
验证pixelmap数据bufferbase64是否正常
2129浏览 • 1回复 待解决
如何将PixelMap图片base64字符串?
812浏览 • 1回复 待解决
HarmonyOS base64解码
283浏览 • 0回复 待解决
HarmonyOS base64解码报错
1326浏览 • 1回复 待解决
js canvasbase64编码图片不全
11062浏览 • 1回复 待解决
HarmonyOS 如何实现Base64数据图片
192浏览 • 1回复 待解决
HarmonyOS如何将图片Base64
1170浏览 • 1回复 待解决
如何将图片base64字符串PixelMap
930浏览 • 1回复 待解决
HarmonyOS base64image
293浏览 • 1回复 待解决
如何base64换成图片
10584浏览 • 2回复 待解决
HarmonyOS base64解码内容缺少
195浏览 • 1回复 待解决
照片文件Base64
140浏览 • 1回复 待解决
HarmonyOS 录制视频base64
290浏览 • 1回复 待解决
HarmonyOS arraybufferbase64乱码
343浏览 • 1回复 待解决
HarmonyOS 图片操作,合成导出base64
378浏览 • 1回复 待解决
HarmonyOS 图片Base64编码
297浏览 • 1回复 待解决
HarmonyOS 如何将沙盒图片base64
302浏览 • 1回复 待解决