- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的元素中,我有一个 Canvas (200*150),我想绘制一个大小为 (800*600) 的图像。结果是图像变得更蓝(不平滑和不清晰),但如果我们将该图像放在 img 标签上,它看起来不错。那么我们该如何处理呢?谢谢。
<img src="http://www.drivingkids.com/wp-content/uploads/2010/07/preschool-math-game-for-kids-math-racing-equatations.jpg"
width="200" heigh="150" />
<canvas id="my_canvas" width="200" height="150"></canvas>
<script type="text/javascript">
window.onload = function () {
var context = document.getElementById("my_canvas").getContext("2d");
var image = new Image();
image.src = "http://www.drivingkids.com/wp-content/uploads/2010/07/preschool-math-game-for-kids-math-racing-equatations.jpg";
image.onload = function () {
context.drawImage(image, 0, 0, context.canvas.width, context.canvas.height); //dx-30, GY-28, GW+50, GH+35
}
}
</script>
最佳答案
浏览器可以根据当前情况优先考虑质量或性能。
对于大多数页面而言,图像质量通常优先于性能。但是 Canvas 的性能不如直接浏览器渲染和 CSS,因此 Canvas 的插值可能会优先考虑性能而不是质量。取决于浏览器实现。
幸运的是,有一种方法可以解决这个问题,方法是分两步(或更多步)或一个中间步骤来分担调整大小和插值的负担。
中间步骤首先将图像缩放 50% 到离屏 Canvas 。然后使用该 Canvas 绘制到最终尺寸。对于较大的图像,可能需要更多步骤。
由于获得新尺寸的操作总和,花费在 sum 上的时间大致相同(更简单地说:用中间步骤 x2 插值的时间更少,而插值 x1 的时间更多)所以你不会注意到太多性能降低。
但最重要的是:结果会比仅仅一步更好。
这是实现中间步骤的方法:
image.onload = function () {
/// create an extra step for re-sizing image
var tmpCanvas = document.createElement('canvas'),
tmpContext = c.getContext('2d');
/// set this canvas to 50% of image
tmpCanvas.width = image.width * 0.5;
tmpCanvas.height = image.height * 0.5;
/// draw image step 1
tmpContext.drawImage(image, 0, 0, image.width * 0.5, image.height * 0.5);
/// draw image step 2
context.drawImage(tmpCanvas, 0, 0, canvas.width, canvas.height);
}
结果将是:
左图:IMG 元素。右图: Canvas 两步(在 Firefox 中呈现)
如您所见,图像和 Canvas 元素之间现在没有明显区别。
关于javascript - 在小 Canvas 上绘制的大图像变得模糊,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18527153/
我在 android 代码中使用 asmack XMPP。我可以正常登录 XMPP 服务器,但是当我尝试创建新用户时出现问题。我想要实现的是: 以管理员身份登录。 创建一个新用户。 从管理员注销。 以
这是我的标记页面,其中有一个按钮可以从数据库中搜索数据并显示在网格中 这是我背后的代码 if (!IsPostBack) { LblInfo.Text = "Page Load
当我多次将相同的 float 值插入到我的集合中时,本应花费恒定时间的 x in s 检查变得非常慢。为什么? 时序x in s的输出: 0.06 microseconds 0.09 mi
我有一个小型聊天客户端,可以将所有历史记录存储在 sqlite 数据库中。当用户单击我的应用程序中的 history 选项卡时,我的应用程序会获取所有相关历史记录并将其显示在 QWebView 中。我
我是一名优秀的程序员,十分优秀!