file.ts 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import { base64ToBlob, uuid } from "./comm";
  2. /**
  3. * 将canvas转换为png图片
  4. * @param options 转换参数
  5. * @returns 图片路径
  6. */
  7. export function canvasToPng(canvasRef: UniElement): Promise<string> {
  8. return new Promise((resolve) => {
  9. // #ifdef APP
  10. canvasRef.parentElement!.takeSnapshot({
  11. success(res) {
  12. resolve(res.tempFilePath);
  13. },
  14. fail(err) {
  15. console.error(err);
  16. resolve("");
  17. }
  18. });
  19. // #endif
  20. // #ifdef H5
  21. const url = URL.createObjectURL(
  22. base64ToBlob(
  23. (canvasRef as unknown as HTMLCanvasElement)?.toDataURL("image/png", 1) ?? ""
  24. )
  25. );
  26. resolve(url);
  27. // #endif
  28. // #ifdef MP
  29. uni.createCanvasContextAsync({
  30. id: canvasRef.id,
  31. component: canvasRef.$vm,
  32. success(context) {
  33. // 获取2D绘图上下文
  34. const ctx = context.getContext("2d")!;
  35. // 获取canvas对象
  36. const canvas = ctx.canvas;
  37. // 将canvas转换为base64格式的PNG图片数据
  38. const data = canvas.toDataURL("image/png", 1);
  39. // 获取文件系统管理器
  40. const fileMg = uni.getFileSystemManager();
  41. // 生成临时文件路径
  42. // @ts-ignore
  43. const filepath = `${wx.env.USER_DATA_PATH}/${uuid()}.png`;
  44. // 将base64数据写入文件
  45. fileMg.writeFile({
  46. filePath: filepath,
  47. data: data.split(",")[1],
  48. encoding: "base64",
  49. success() {
  50. resolve(filepath);
  51. },
  52. fail(err) {
  53. console.error(err);
  54. resolve("");
  55. }
  56. });
  57. },
  58. fail(err) {
  59. console.error(err);
  60. resolve("");
  61. }
  62. });
  63. // #endif
  64. });
  65. }