You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iPad端Canvas绘制图片缩放模糊问题求助

解决方案:iPad WKWebView中Canvas绘制高清图片适配

核心问题

你的canvas仅设置了显示尺寸(1180x820),但iPad是Retina屏,设备像素比(DPR)为2,实际屏幕物理分辨率是2360x1640。直接用1180x820的canvas绘制,相当于每个canvas像素被拉伸到2x2的物理像素,缩放图片后自然模糊。

解决步骤

  1. 适配Canvas的实际像素与显示尺寸
    把canvas的实际像素宽高设为显示尺寸的DPR倍,再通过CSS固定显示尺寸:

    const canvas = document.getElementById('target-canvas');
    const ctx = canvas.getContext('2d');
    const dpr = window.devicePixelRatio || 1;
    
    // 设置canvas实际像素分辨率(匹配屏幕物理像素)
    canvas.width = 1180 * dpr;
    canvas.height = 820 * dpr;
    // 设置canvas显示尺寸(占满WKWebView)
    canvas.style.width = '1180px';
    canvas.style.height = '820px';
    
    // 缩放绘图上下文,后续直接用显示尺寸计算坐标/尺寸即可
    ctx.scale(dpr, dpr);
    
  2. 正确计算图片缩放比例并绘制
    基于canvas的显示尺寸(1180x820)计算原图(1920x1080)的适配比例,保证图片完整显示且清晰:

    const imgMenu = new Image();
    imgMenu.src = '你的图片资源路径';
    imgMenu.onload = function() {
      const canvasW = 1180;
      const canvasH = 820;
      const imgRatio = imgMenu.width / imgMenu.height;
      const canvasRatio = canvasW / canvasH;
    
      let drawW, drawH;
      // 按比例适配,避免图片变形
      if (imgRatio > canvasRatio) {
        drawW = canvasW;
        drawH = canvasW / imgRatio;
      } else {
        drawH = canvasH;
        drawW = canvasH * imgRatio;
      }
    
      // 开启高清平滑(现在会生效)
      ctx.imageSmoothingEnabled = true;
      ctx.imageSmoothingQuality = 'high';
    
      // 左上角绘制(如果需要居中,x=(canvasW-drawW)/2,y=(canvasH-drawH)/2)
      ctx.drawImage(imgMenu, 0, 0, drawW, drawH);
    };
    

为什么之前的设置无效?

你之前开启的imageSmoothingEnabled等参数,只有在canvas的实际像素足够时才会生效。之前的canvas实际像素远低于屏幕物理分辨率,缩放图片时没有足够的像素填充,自然会模糊。现在用高分辨率canvas配合正确缩放,就能利用iPad的Retina屏幕展示清晰的图片。

内容的提问来源于stack exchange,提问作者Alx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 01:21:04