uni-app CanvasContext.drawImage在ios手机下拍照图片无法绘制

发布于 1周前 作者 bupafengyu 来自 Uni-App

uni-app CanvasContext.drawImage在ios手机下拍照图片无法绘制

开发环境 版本号 项目创建方式
Windows win11专业版 HBuilderX
3.98

示例代码:

uni.getImageInfo({
src: imgUrl,
success: res => {
let canvas = null
if(!canvas) {
canvas = uni.createCanvasContext(canvasId, slef)
}
canvas.drawImage(res.path, 0, 0, w, h)
canvas.draw(true,function(result){
})
}  
})

操作步骤:

特定机型下必现

预期结果:

正常图片绘制

实际结果:

无法绘制手机相机拍摄的图片

bug描述:

其他机型可用,仅iphone7 plus测试出现通过拍照获取的文件路径无法CanvasContext.drawImage绘制,绘制后成现为默认背景色白色,从相册中选择的文件为正常。

通过相机拍摄得到的文件路径示例:file:///var/mobile/Containers/Data/Application/7BC144C7-DA9E-4C0E-8E32-AEC01870264D/Documents/Pandora/apps/89E26DC75D9413E3EA8DDD84CB5BBD00/doc/uniapp_temp_1702376164416/camera/photo_001.jpg

从相册中选择路径示例:file:///var/mobile/Containers/Data/Application/7BC144C7-DA9E-4C0E-8E32-AEC01870264D/Documents/Pandora/apps/89E26DC75D9413E3EA8DDD84CB5BBD00/doc/uniapp_temp_1702376164416/gallery/1702359311-compressed-IMG_0002.WEBP


2 回复

请问解决了吗?


uni-app 中使用 CanvasContext.drawImage 绘制图片时,如果在 iOS 设备上遇到无法绘制拍照图片的问题,可能是由于以下原因引起的:

1. 图片路径问题

  • 问题描述:在 iOS 设备上,拍照后返回的图片路径可能是 blobfile 路径,而不是标准的 base64http 路径,导致 drawImage 无法识别。
  • 解决方案:将图片路径转换为 base64http 路径后再绘制。
// 假设 photoPath 是拍照后返回的图片路径
uni.getImageInfo({
  src: photoPath,
  success: (res) => {
    const canvas = uni.createCanvasContext('myCanvas');
    canvas.drawImage(res.path, 0, 0, 100, 100);
    canvas.draw();
  },
  fail: (err) => {
    console.error('获取图片信息失败', err);
  }
});

2. 图片加载问题

  • 问题描述:在绘制图片之前,图片可能还未加载完成,导致绘制失败。
  • 解决方案:确保图片加载完成后再进行绘制。
const img = new Image();
img.src = photoPath;
img.onload = () => {
  const canvas = uni.createCanvasContext('myCanvas');
  canvas.drawImage(img, 0, 0, 100, 100);
  canvas.draw();
};
img.onerror = (err) => {
  console.error('图片加载失败', err);
};

3. Canvas 上下文问题

  • 问题描述:在某些情况下,Canvas 上下文可能未正确初始化或绑定。
  • 解决方案:确保 CanvasContext 已正确创建并绑定到 Canvas 元素。
const canvas = uni.createCanvasContext('myCanvas');
// 确保 CanvasContext 已正确绑定到 Canvas 元素
canvas.drawImage(photoPath, 0, 0, 100, 100);
canvas.draw();

4. iOS 权限问题

  • 问题描述:在 iOS 设备上,访问相册或相机可能需要额外的权限。
  • 解决方案:确保应用已正确配置并获取了访问相册或相机的权限。
uni.authorize({
  scope: 'scope.album',
  success: () => {
    console.log('已获取相册权限');
  },
  fail: (err) => {
    console.error('获取相册权限失败', err);
  }
});

5. Canvas 绘制延迟

  • 问题描述:在 iOS 设备上,Canvas 绘制可能会有轻微的延迟。
  • 解决方案:在绘制完成后,稍作延迟再进行下一步操作。
const canvas = uni.createCanvasContext('myCanvas');
canvas.drawImage(photoPath, 0, 0, 100, 100);
canvas.draw(() => {
  setTimeout(() => {
    console.log('绘制完成');
  }, 100);
});

6. 图片格式问题

  • 问题描述:某些图片格式在 iOS 设备上可能不支持。
  • 解决方案:确保图片格式为 iOS 支持的格式(如 JPEGPNG)。
uni.getImageInfo({
  src: photoPath,
  success: (res) => {
    if (res.type === 'jpeg' || res.type === 'png') {
      const canvas = uni.createCanvasContext('myCanvas');
      canvas.drawImage(res.path, 0, 0, 100, 100);
      canvas.draw();
    } else {
      console.error('不支持的图片格式');
    }
  },
  fail: (err) => {
    console.error('获取图片信息失败', err);
  }
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!