HarmonyOS 图片压缩和图片转base64

​有个选择图片的需求,选择图片我用的PhotoViewPicker,返回的uri,拿到uri之后,我还需要做图片压缩和图片转base64

1、图片压缩

2、图片转base64​


HarmonyOS
2024-11-22 11:01:22
822浏览
收藏 0
回答 1
回答 1
按赞同
/
按时间
Excelsior_abit
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 
  }) 
} 
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
分享
微博
QQ
微信
回复
2024-11-22 15:57:36
相关问题
HarmonyOS 图片base64
937浏览 • 1回复 待解决
怎么把PixelMap图片BASE64
10378浏览 • 1回复 待解决
HarmonyOS 拍照后的图片base64
677浏览 • 1回复 待解决
HarmonyOS 如何实现Base64数据图片
901浏览 • 1回复 待解决
HarmonyOS如何将图片Base64
1953浏览 • 1回复 待解决
js canvasbase64编码图片不全
12026浏览 • 1回复 待解决
如何base64换成图片
11506浏览 • 2回复 待解决
HarmonyOS 图片base64码后乱码
719浏览 • 1回复 待解决
HarmonyOS 如何将图片压缩并转成base64
1235浏览 • 1回复 待解决
HarmonyOS 图片Base64编码
832浏览 • 1回复 待解决
HarmonyOS 如何将沙盒图片base64
981浏览 • 1回复 待解决
HarmonyOS base64image
754浏览 • 1回复 待解决
HarmonyOS pixelMap怎么base64
607浏览 • 1回复 待解决
照片文件Base64
622浏览 • 1回复 待解决
HarmonyOS 图片进行base64编码报错
1378浏览 • 1回复 待解决
HarmonyOS arraybufferbase64乱码
860浏览 • 1回复 待解决
如何将PixelMap图片base64字符串?
1544浏览 • 1回复 待解决
如何将图片base64字符串PixelMap?
1601浏览 • 1回复 待解决
HarmonyOS Image如何显示base64图片
1273浏览 • 1回复 待解决
HarmonyOS 关于Image组件使用base64图片
1455浏览 • 1回复 待解决
HarmonyOS base64图片如何转成Arraybuffer
542浏览 • 1回复 待解决
HarmonyOS 图片操作,合成后导出base64
982浏览 • 1回复 待解决
HarmonyOS 录制的视频base64
850浏览 • 1回复 待解决