问答

canvas中drawImage通过鼠标控制图片缩放速度问题?

作者:admin 2021-05-15 我要评论

以下是显示控制图片拖动,居中,缩放的所有js代码;(代码从网上找的) var canvas, context;var imageWidth, imageHeight;var img,//图片对象 imgIsLoaded,//图...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

以下是显示控制图片拖动,居中,缩放的所有js代码;(代码从网上找的)

var canvas, context;
var imageWidth, imageHeight;
var img,//图片对象
  imgIsLoaded,//图片是否加载完成;
  imgX = 0,
  imgY = 0,
  imgScale = 1;
function loadImg() {
  img = new Image();
  img.onload = function () {
    imgIsLoaded = true;
    imgX = (canvas.width - img.width) / 2;
    imgY = (canvas.height - img.height) / 2
    drawImage();
  }
  img.src = 'http://127.0.0.1:52409/%E4%B8%89%E5%93%A5%E5%B0%8F%E8%88%9E.jpeg';
}
function drawImage() {
  context.clearRect(0, 0, canvas.width, canvas.height);
  context.drawImage(
    img, //规定要使用的图像、画布或视频。
    0, 0, //开始剪切的 x 坐标位置。
    img.width, img.height,  //被剪切图像的高度。
    imgX, imgY,//在画布上放置图像的 x 、y坐标位置。
    img.width * imgScale, img.height * imgScale  //要使用的图像的宽度、高度
  );
  canvasEventsInit()
}
/*事件注册*/
function canvasEventsInit() {
  canvas.onmousedown = function (event) {
    var pos = windowToCanvas(event.clientX, event.clientY);  //坐标转换,将窗口坐标转换成canvas的坐标

    canvas.onmousemove = function (evt) {  //移动
      canvas.style.cursor = 'move';
      var posl = windowToCanvas(evt.clientX, evt.clientY);
      var x = posl.x - pos.x;
      var y = posl.y - pos.y;
      pos = posl;
      imgX += x;
      imgY += y;
      drawImage();  //重新绘制图片
    };
    canvas.onmouseup = function () {
      canvas.onmousemove = null;
      canvas.onmouseup = null;
      canvas.style.cursor = 'default';
    };
  };

  canvas.onmousewheel = canvas.onwheel = function (event) {    //滚轮放大缩小
    var pos = windowToCanvas(event.clientX, event.clientY);
    event.wheelDelta = event.wheelDelta ? event.wheelDelta : (event.deltalY * (-40));  //获取当前鼠标的滚动情况
    if (event.wheelDelta > 0) {
      imgScale *= 2;
      imgX = imgX * 2 - pos.x;
      imgY = imgY * 2 - pos.y;
    } else {
      imgScale /= 2;
      imgX = imgX * 0.5 + pos.x * 0.5;
      imgY = imgY * 0.5 + pos.y * 0.5;
    }
    drawImage();   //重新绘制图片
  };
}


/*坐标转换*/
function windowToCanvas(x, y) {
  var box = canvas.getBoundingClientRect();  //这个方法返回一个矩形对象,包含四个属性:left、top、right和bottom。分别表示元素各边与页面上边和左边的距离
  return {
    x: x - box.left - (box.width - canvas.width) / 2,
    y: y - box.top - (box.height - canvas.height) / 2
  };
}
(function int() {
  canvas = document.getElementById('canvas'); //画布对象
  canvas.width = canvas.getBoundingClientRect().width;
  canvas.height = canvas.getBoundingClientRect().height;
  context = canvas.getContext('2d');//画布显示二维图片
  loadImg();

})();

我的问题是以下这个代码中的这个缩放的原理(如何计算的)?我如何控制这个缩放速度慢一些?

 canvas.onmousewheel = canvas.onwheel = function (event) {    //滚轮放大缩小
    var pos = windowToCanvas(event.clientX, event.clientY);
    event.wheelDelta = event.wheelDelta ? event.wheelDelta : (event.deltalY * (-40));  //获取当前鼠标的滚动情况
    if (event.wheelDelta > 0) {
      imgScale *= 2;
      imgX = imgX * 2 - pos.x;
      imgY = imgY * 2 - pos.y;
    } else {
      imgScale /= 2;
      imgX = imgX * 0.5 + pos.x * 0.5;
      imgY = imgY * 0.5 + pos.y * 0.5;
    }
    drawImage();   //重新绘制图片
  };
###

imgScale,取值大于 1小于2
然后紧跟着的两行代码,为 2 的参数跟着 imgScale 变,另一个则始终为 1 / imgScale

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • 请问下prometheus怎么进行自定义的按业

    请问下prometheus怎么进行自定义的按业

  • 节流函数为什么,点击无效,监听窗口大

    节流函数为什么,点击无效,监听窗口大

  • express访问静态资源失败

    express访问静态资源失败

  • IE 浏览器下 match 方法报错

    IE 浏览器下 match 方法报错

腾讯云代理商
海外云服务器