为什么我在`mousemove`中使用drawImage时会得到不良图像?

一世

我想在动作mousemove时绘制图像,但是当我在使用drawImage时mousemove得到错误的图像(请参见右图):

在此处输入图片说明

为什么在动作时图像绘制不好mousemove

PS:我想用高质量的左图绘制右图;

var canvas = document.getElementById('canvas_test');
var context = canvas.getContext("2d");
var img_test__src = 'http://image.prntscr.com/image/8233c5a42e7e4b40a19c64d8e9b892ee.png';

var img = new Image();
img.src = img_test__src;
img.onload = function() {
  context.save();
  context.beginPath();
  context.drawImage(img, 100, 100, 71, 71);
  context.closePath();
  context.restore();
};

canvas.addEventListener('mousemove', function(evt) {
  var img = new Image();
  img.src = img_test__src;
  img.onload = function() {
    context.save();
    context.beginPath();
    context.drawImage(img, 200, 100, 71, 71);
    context.closePath();
    context.restore();
  };
});
#canvas_test {
  background: #000;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<canvas id="canvas_test" width="500" height="500"></canvas>

盲人67

永远不要在IO事件中渲染

绝对不要在事件中渲染。频率和时序不受您的控制,并且可能产生各种问题,尤其是当您开始发生许多此类事情时。

requestAnimationFrame即使仅用于一帧也要使用这将确保正确绘制图像并与正在发生的任何其他动画或视觉更新同步。

不要一遍又一遍地加载图像!!!

我必须给出答案,因为您也在事件中加载图像。

每移动一次鼠标,也许每秒移动约100或更多,您就会创建一个新图像并等待其加载。您应该已经注意到页面有时会滞后。

一次加载图像。

例子

我假设您想要将鼠标悬停在FX上

var canvas = document.getElementById('canvas_test');
var context = canvas.getContext("2d");
var img_test__src = 'http://image.prntscr.com/image/8233c5a42e7e4b40a19c64d8e9b892ee.png';

var img = new Image();
img.src = img_test__src;
img.onload = drawImg;
var mouseOver = false;
function drawImg(){
   if(img.complete){ // has image loaded
       context.clearRect(0,0,canvas.width,canvas.height);
       context.globalAlpha = mouseOver ? 1 : 0.5;
       context.drawImage(img,0,0);
       context.globalAlpha = 1;
   }
}
canvas.addEventListener('mouseover', function(evt) {
   mouseOver = true;
   requestAnimationFrame(drawImg);
});
canvas.addEventListener('mouseout', function(evt) {
   mouseOver = false;
   requestAnimationFrame(drawImg);
});
#canvas_test {
  background: #000;
}
   
<canvas id="canvas_test" width="65" height="65"></canvas>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在使用rand()时会得到这种特殊的颜色模式?

JavaScript:为什么在使用数组中的随机数时会得到未定义的值?

为什么在使用String.fromCharCode时会得到\ u0000而不是字符?

为什么在imshow()中使用浮点数组时,为什么会得到彩色噪点图,但是如果使用uint8,我会得到想要的图像?

为什么在找到内存使用高峰时会得到不同的结果?

为什么在Googlesheets-importxml中使用xpath而不在Chrome HTML调试器中使用xpath时会得到“ N / A”?

我需要了解为什么在将值添加到标签时会得到null?

为什么在python中使用re.split()时会得到那些空字符串?

为什么当我有特定的尺寸时会得到两行

为什么我会得到NoneType?

为什么在Swift中使用pow会得到错误的答案?

为什么我在添加字符时会得到一个数字?

为什么在使用sh和bash时会得到不同的输出?

为什么在使用for和while循环时会得到不同的结果?

为什么在OZ中使用Show时会得到sum(<P / 3> <P / 3>)?

为什么在使用嵌套属性时会得到哈希而不是数组?

为什么在服务中的函数中使用 let 和 new 创建新对象时会得到旧对象?

为什么在 iOS Swift 3 中尝试使用 dateFormatter 时会得到 nil?

为什么使用php将CSV文件导入MySQL时会得到重复的数据

为什么在使用 ResultSet 时会得到一个额外的结果为 null?

为什么我在 android 中使用应用程序拍照时会得到低分辨率的照片?

为什么在过滤器中使用 if 语句作为反对只返回时会得到不同的输出

为什么我在绘制分布时会得到多条线?

为什么在 Promise.all 中使用 fetch 时会得到 Promise { <pending> }?

为什么我有时会得到嵌入的属性有时不会?

为什么在 Laravel 中使用 PostController 时会得到 Undefined 变量?

为什么我在检查安装版本时会得到这个 PyPy 输出?

为什么在 GridSearchCV 中使用 StandardScaler 会得到不同的结果?

为什么在使用 useEffect 从区块链获取数据时会得到一系列 promise?