{
  "path": "/tutorials/cursor-canvas-dpr-sharp-png-export",
  "reviewedAt": "2026-10-23",
  "version": "浏览器原生Canvas2D/Image.decode；Cursor未安装",
  "status": "actual-canvas-complete-native-cursor-unverified",
  "sourceURLs": [
    "https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio",
    "https://cursor.com/docs/agent/tools/browser"
  ],
  "validationScope": "真实浏览器Canvas：模拟预览DPR1/2/3，预览内部尺寸600×400/1200×800/1800×1200；三个实际PNG Blob经Image.decode均1200×800、53686字节，pass:true。真实devicePixelRatio始终1。未执行Cursor会话，浏览器文件保存等待超时，不能声称下载文件已落盘。",
  "bodySteps": [
    "通过本地HTTP服务打开下载包index.html，不把源码图片当浏览器运行。",
    "选择模拟预览DPR1，再点重复绘制3次，每次setTransform重置，避免scale累积。",
    "点导出；新建独立1200×800画布绘制，toBlob真实编码PNG，用Image.decode解码实际Blob。",
    "再选择模拟DPR2和3，各重复绘制并导出；预览内部像素变化，导出实际像素固定1200×800。",
    "保存页面原始JSON及三个PNG，对应截图只标Canvas真实操作；Cursor原生需求提交与会话未执行。"
  ],
  "files": [
    {
      "file": "README.md",
      "bytes": 909,
      "sha256": "44c65e16c0df03060774676668a8af33d853a9905c3f0602ddc5660e4d7d1540"
    },
    {
      "file": "canvas-browser-final.json",
      "bytes": 220,
      "sha256": "c4058a0ba044aac06351ce252ebb73e7d255d93824055f9df7c7712ccb554ea7"
    },
    {
      "file": "index.html",
      "bytes": 3098,
      "sha256": "9bec8c97bd5b93a90b05596c897b7d159765589d6cbe7e952b783f604ca9cdf6"
    }
  ],
  "privateCredentialsPublished": false,
  "commands": [
    "python -m http.server 8788 --bind 127.0.0.1"
  ],
  "observations": [
    "模拟预览DPR1、2、3的内部像素分别600×400、1200×800、1800×1200。",
    "真实设备devicePixelRatio均1；模拟值和设备值分别记录。",
    "三个Blob实际解码均1200×800 PNG、53686字节、pass:true。",
    "重复绘制3次不累积transform，最终第12次重绘仍通过。"
  ],
  "limits": [
    "Cursor未安装，未执行Cursor原生会话；这是作者Canvas工程实际浏览器运行。",
    "浏览器文件保存等待API超时，仅能确认toBlob及Image.decode成功，不能确认下载文件写入磁盘。",
    "模拟DPR不是三种物理设备或三种浏览器设备像素比测试。"
  ],
  "tokenbaTestKeyUsed": false,
  "timeoutInferenceUsage": "本地路线；没有使用apizt测试Key。"
}