在HarmonyOS开发中图片压缩和图片转base64问题?

在HarmonyOS开发中图片压缩和图片转base64问题?有个选择图片的需求,选择图片我用的PhotoViewPicker,返回的uri,拿到uri之后,我还需要做图片压缩和图片转base64
1、图片压缩
2、图片转base64

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

阅读 670
1 个回答

具体解决方案:

async aboutToAppear(): Promise<void> { 
  const resourceManager = getContext(this).resourceManager 
  const imageArray = await resourceManager.getMediaContent($r('app.media.100')); 
  ​ 
  console.log("yuv_path is:" + path); 
  let file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 
  ​ 
  fs.write(file.fd, imageArray.buffer).then((writeLen) => { 
  console.info("write data to file succeed and size is:" + writeLen); 
  fs.closeSync(file); 
}).catch((err: BusinessError) => { 
  console.info("write data to file failed with error message: " + err.message + ", error code: " + err.code); 
}); 
} 
2.创建pixelMap,并调用压缩方法 
 
  / // path为已获得的沙箱路径 
  const imageSource: image.ImageSource = image.createImageSource(path); 
​ 
//创建pixelMap 
this.pixelMap = await imageSource.createPixelMap(decodingOptions); 
​ 
console.log("6666661" + this.pixelMap.getPixelBytesNumber()); 
//指定压缩宽、高、大小 
this.packingDetail(500, 500, 100) 
3.根据压缩后目标图片宽高计算缩放比 并进行缩放,调用packing方法实现第一次压缩 
 
if (this.pixelMap) { 
  Logger.info("tag before scaling pixelmap." + this.pixelMap.getPixelBytesNumber()); 
  ​ 
  let imageInfo = await this.pixelMap.getImageInfo(); 
  ​ 
  let a = this.pixelMap 
  //计算压缩比 
  let scaleX: number = targetWidth / imageInfo.size.width; 
  let scaleY: number = targetHeight / imageInfo.size.height; 
  this.pixelMap.scale(scaleX, scaleY, (err: BusinessError) => { 
    if (err) { 
      console.error("tag Failed to scale pixelmap."); 
      return; 
    } else { 
      console.log("tag in scaling pixelmap." + a.getPixelBytesNumber()); 
    } 
  }); 
} 
let imagePackerApi = image.createImagePacker(); 
let packOpts: image.PackingOption = { format: "image/jpeg", quality: 100 }; 
imagePackerApi.packing(this.pixelMap, packOpts).then((data: ArrayBuffer) => { 
  Logger.info("tag in 100 quality data" + data.byteLength) 
  this.compressPictures(data, targetPixelSize, 99); 
}); 
4.调用递归算法,当压缩后的data ,小于等于压缩目标图片大小时将data写入本地沙箱并结束递归 
 
compressPictures(data?: ArrayBuffer, size?: number, quality?: number): void { 
  if (data && size && quality) { 
  const currentSize = data.byteLength / 1024 
  if (currentSize <= size || quality === 0) { 
  console.log("finally quallity is:" + ++quality) 
  let file = fs.openSync(path9, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE); 
  fs.write(file.fd, data).then(async (writeLen) => { 
  console.info("write data to file succeed2 and size is:" + writeLen); 
  fs.closeSync(file); 
}).catch((err: BusinessError) => { 
  console.info("write data to file failed1 with error message: " + err.message + ", error code: " + err.code); 
}); 
return; 
} 
} 
if (quality) { 
  let packOpts: image.PackingOption = { format: "image/jpeg", quality: quality } 
  let imagePackerApi = image.createImagePacker(); 
  imagePackerApi.packing(this.pixelMap, packOpts) 
    .then((ret: ArrayBuffer) => { 
      //递归算法,直到压缩到指定大小的data 
      if (quality) { 
        Logger.info("PACKING66666"+quality) 
        return this.compressPictures(ret, size, quality - 1) 
      } 
      ​ 
    }).catch((err: BusinessError) => { 
    console.log(`111`) 
    return false 
  }) 
} 
}

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

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