javascript - 如何使用 Canvas drawImage 处理质量损失?

标签 javascript canvas svg html5-canvas

我在 Stackoverflow 上看到过这个问题,但我没有找到答案 - 所有提出的解决方案都不适合我。

问题:当我将 base64 编码的 SVG 作为 src 传递给图像时,它看起来像原始 SVG 图像一样清晰。但如果我将这张图片用于 Canvas (通过 context.drawImage)——它的质量会更差: enter image description here

问题是 - 如何在 Canvas 中绘制基于 svg 的图像,使其看起来像原始图像?

到目前为止我尝试了什么。描述的方法 here (重新迭代下采样)对我不起作用。其他advise (将尺寸增加 0.5)也没有挽救这种情况。玩imageSmoothingEnabled - 仍然没有运气。

这是 the codepen用于生成此特定屏幕截图:

let toBase64 = (svg) => {
  let serialized = new XMLSerializer().serializeToString(svg);
  let base64prefix = "data:image/svg+xml;base64,"
   let enc = base64prefix + btoa(serialized);
  return enc;
}

let copySvg = (svg, img) => {
  let enc = toBase64(svg);
  img.src = enc;
}

let copyImg = (img, canvas) => {
  context = canvas.getContext("2d");
  context.drawImage(img, 0, 0, 200.5, 200.5);
}

let main = () => {
   let svg = document.getElementById("svg");
   let img = document.getElementById("img");
   let canvas = document.getElementById("canvas");
   copySvg(svg, img);
   copyImg(img, canvas);
}

window.onload = main;

最佳答案

SVG 和图像是在高 DPI 下隐式绘制的,但您需要为 Canvas 显式处理这种情况。

如果您的设备有 window.devicePixelRatio === 2,如果您增加 Canvas 大小并更新 drawImage 以匹配,您将看到更清晰的图像:

<!-- Change this -->
<canvas id="canvas" width="200" height="200"></canvas>
<!-- to -->
<canvas id="canvas" width="400" height="400"></canvas>

和:

// change this:
context.drawImage(img, 0, 0, 200.5, 200.5);
// to:
context.drawImage(img, 0, 0, 400, 400);

Forked codepen

有关 window.devicePixelRatio(和 Canvas 的 backingStorePixelRatio)的更多详细信息,请参阅 High DPI Canvas 上的 html5rocks 文章

关于javascript - 如何使用 Canvas drawImage 处理质量损失?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43656352/

相关文章:

Javascript - 自定义确认对话框 - 替换 JS 确认

Javascript - 如何识别圆弧的碰撞

canvas - 带有rasa的Google Interactive Canvas

javascript - 此示例使用什么 javascript 对象模式?

javascript - 为什么 SVG(大小、定位)在不同的浏览器中不同?

javascript - 你如何在 jQuery 中使用 $ ('document' ).ready(function()) ?

javascript - Angular 2 如何从组件的外部脚本调用 jQuery 函数

html - 如何将缩放的 SVG 元素集中在一个点上?

svg - 为什么在 PHP 中使用 ImageMagick 将 SVG 光栅化为 PNG 时会得到 NoDecodeDelegateForThisImageFormat?

javascript - 使用 Angular 和javascript对表进行条件格式化