javascript - HTML5 Canvas .translate 和 .scale 导致图像出现锯齿状边缘

标签 javascript html canvas

这是一个示例:Codepen .只需单击 Canvas 中的任意位置(它会有黑色边框),就会绘制出一个紫色的星星。

如您所见,星星的边缘呈锯齿状。它是用 .translate.scale 绘制的。要证明 .translate.scale 导致锯齿状边缘,请转到第 28 行(在 CodePen JavaScript 部分)并取消注释。然后注释掉第 27 行。当您在 Canvas 上单击时,绘制的星星没有 .translate.scale,但它没有锯齿状边缘。

星星是在 Adob​​e Illustrator 中绘制的,并以 300x300 像素的 PNG 格式导出。

更新: 顺便说一下,我需要使用 PNG。没有 JPGSVG

我该如何解决这个问题?


到目前为止我已经尝试过但没有帮助的:

  1. 在 Adob​​e Illustrator 的常规首选项中关闭抗锯齿
  2. 在 Adob​​e Illustrator 的文档光栅和效果设置中关闭抗锯齿
  3. 在 Illustrator 的文档光栅和效果设置中使用屏幕 72ppi 而不是 300ppi(默认)
  4. 在星星上画笔划(边框)并使此笔划的不透明度为 0%。我认为只有边界/边缘会出现锯齿状。因此,我认为笔划将是“不可见的”,因为 canvas 只会使 0% 不透明度笔划呈锯齿状,因此没有任何东西看起来呈锯齿状。但这也没有用。
  5. 我已经尝试使用这些 CSS 建议的“hacks”:

    Canvas { 图像渲染:清晰的边缘;/* 旧版本的 FF */ 图像渲染:-moz-crisp-edges;/* 法郎 6.0+ */ 图像渲染:-webkit-optimize-contrast;/* 苹果浏览器 */ 图像渲染:-o-crisp-edges;/* OS X & Windows Opera (12.02+) */ /*图像渲染:像素化;//很棒的 future 浏览器 */ 图像渲染:优化对比度; -ms-插值模式:最近邻;/*IE*/ }

  6. 我也尝试过使用这个 JavaScript“hack”:

    context.webkitImageSmoothingEnabled = true; context.mozImageSmoothingEnabled = true; context.imageSmoothingEnabled = true;/// future


注意:在将所有代码添加到 Codepen 之前,我已经在 Safari、Firefox 和 Chrome 上本地尝试了 Codepen 中的所有代码。

最佳答案

如果将星号更改为矢量,问题就会解决。

star_img.src='data:image/svg+xml;utf8,<svg width="300px" height="275px" viewBox="0 0 300 275" xmlns="http://www.w3.org/2000/svg" version="1.1"><polygon fill="#fdff00" stroke="#605a00" stroke-width="15" points="150,25  179,111 269,111 197,165 223,251  150,200 77,251  103,165 31,111 121,111" /></svg>';

http://codepen.io/anon/pen/QyBGMv

关于javascript - HTML5 Canvas .translate 和 .scale 导致图像出现锯齿状边缘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35139999/

相关文章:

html - 随着屏幕分辨率的变化保持元素放置

html - 将两个 HTML 文档嵌入到一个页面中

javascript - Javascript 中的 Fisher-Yates Shuffle

javascript - 我可以分发一个使用 redux 的 React 组件吗?

javascript - 如何获取strong标签中写入的内容?

java - 如何处理 Canvas 中的多个元素

javascript - 无法弄清楚为什么数组不应该更新?

javascript - 在HTML5 Canvas 椭圆中,startAngle是什么意思?

javascript - 如何在 jQuery 中制作图像链接列表?

javascript - 将所选内容复制到剪贴板仅有效一次