【问题标题】:HTML canvas image is far lower quality than original image. Why? [duplicate]HTML 画布图像的质量远低于原始图像。为什么? [复制]
【发布时间】:2017-12-25 04:07:56
【问题描述】:

我有一个带有图像和画布元素的简单 HTML 文档。图片 src 只是在网上找到的一些高质量图片,只是为了说明我的观点。当我尝试将图像绘制到画布上时,生成的画布图像非常像素化且质量低下。我似乎无法弄清楚为什么。 类似的问题已经在这里提出,但我找不到似乎可以解决问题的答案。如果有人发现另一篇具有有效答案的帖子,请告诉我。任何帮助是极大的赞赏。提前致谢!

这是带有代码的 JSfiddle: https://jsfiddle.net/vey309b0/5/

HTML:

<p>the original image:</p>
<img id="img_cam" src="https://4.bp.blogspot.com/k8IX2Mkf0Jo/U4ze2gNn7CI/AAAAAAAA7xg/iKxa6bYITDs/s0/HOT+Balloon+Trip_Ultra+HD.jpg" width="400">
<p>the canvas with drawn image:</p>
<canvas id="imgcanvas" width="400"></canvas>

JavaScript:

var canvas = document.getElementById("imgcanvas");
var img_can = document.getElementById("img_cam");
var ctx = canvas.getContext("2d");
var imgWidth = img_can.width;
var imgHeight = img_can.height;
canvas.width = imgWidth;
canvas.height = imgHeight;
ctx.drawImage(img_can, 0, 0, imgWidth, imgHeight);

【问题讨论】:

  • 因为实际图像尺寸为 3,840px × 2,160px,而您将其扭曲为 400px 的宽度,请查看此帖子:stackoverflow.com/a/17862644/2311317
  • 所以我应该通过创建多个画布元素来逐步减少它,每个元素的大小都是之前的 1/2?
  • 更正,或在编辑器中编辑图像并在使用前将其缩小。
  • 感谢所有帮助!请问,如果我把这么高分辨率的图片放到标签里,然后把它缩小到400px的宽度,为什么图片是高分辨率的,而canvas元素不是?我不是以同样的方式减少它们。图像元素不会和画布元素一样变形吗?

标签: javascript html canvas


【解决方案1】:

将画布的宽度和高度设置为图片的naturalWidthnaturalHeight,然后使用CSS来约束画布大小。

var canvas = document.getElementById("imgcanvas");
var ctx = canvas.getContext("2d");
var img_can = document.getElementById("img_cam");
img_can.onload = function() {
  canvas.width = this.naturalWidth;
  canvas.height = this.naturalHeight;
  ctx.drawImage(this, 0, 0);
};
img_can.src = img_can.getAttribute('data-src');
<p>
the original image:
</p>
<img id="img_cam" data-src="https://4.bp.blogspot.com/-k8IX2Mkf0Jo/U4ze2gNn7CI/AAAAAAAA7xg/iKxa6bYITDs/s0/HOT+Balloon+Trip_Ultra+HD.jpg" width="400">
<p>
the canvas with drawn image:
</p>
<canvas id="imgcanvas" style="width:400px;"></canvas>

您还应该在 img 标记上的 onload 侦听器中真正完成这项工作。

【讨论】:

  • 这在这里不起作用。或者回答他的问题
  • @pokeybit - 对我有用,它确实回答了这个问题。画布图像的质量并不完美,但远远优于 OPs JSFiddle。它可能不工作,因为工作没有在图像的onload 中完成,我会解决这个问题。 (第二次加载 sn-p 时它会因为缓存而工作)。
  • 火狐在这里。看起来很震撼
  • 这里的 Firefox,看起来并不完美,但比原来的 JSFiddle 提高了大约 100 倍(主观)
  • 我收回它,在视网膜显示器上它看起来很好,在非视网膜显示器上,你是对的,它很糟糕。
猜你喜欢
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-05
相关资源
最近更新 更多