利用JS的transform对图像进行处理,实现图像的旋转、缩放与适应

本文介绍了如何使用JavaScript的CSStransform属性,配合jQuery,创建一个可以进行图像查看、旋转、放大缩小以及尺寸适应的图片查看器,根据图片与容器的比例动态调整布局。
摘要由CSDN通过智能技术生成

利用JS的transform,做一个图片查看器,对图像进行一些简单的处理,实现图像的查看、旋转、放大、缩小、宽适应、高适应、自适应……

HTML部分:

  <body >
    <div id="button">
      <input type="button" value="宽适应" onclick="adapt('w')" />
      <input type="button" value="高适应" onclick="adapt('h')" />
      <input type="button" value="自适应" onclick="adapt('a')" />
      <input type="button" value="右旋转" onclick="rotate(1)" />
      <input type="button" value="左旋转" onclick="rotate(-1)" />
      <input type="button" value="放大" onclick="scale(1)" />
      <input type="button" value="缩小" onclick="scale(-1)" />
    </div>
    <div id="parent" style="width: 900px;height: 500px;border: solid 1px red;overflow: scroll;display: flex;justify-content:center;align-items:center;">
        <img id="image" src="" alt="" />
    </div>
  </body>

JS部分:

  <script type="text/javascript" src="js/jquery-3.4.1.js"></script>
  <script type="text/javascript">
     //旋转度数
     var rotateNum=0;
     //放大缩小比例
     var scaleNum=1;
     $(function (){
        $("#image").on('load',function (){
           var parent=$("#parent");
           var image=$("#image");
           //清除所有变化
           image.css("transform","");
           //图片加载完成将旋转度数重置为0
           rotateNum=0;
           //图片加载完成将放大缩小比例重置为1
           scaleNum=1;
           if(image.height()/image.width()>=parent.height()/parent.width()){
              //图片高宽比大于父容器高宽比时(宽度一样时,图片比父容器高),图片高适应(将图片设置成和父容器一样高)
              image.css("height","100%");
              image.css("width","auto");
              
           }else{
              //图片高宽比小于父容器高宽比时(高度一样时,图片比父容器宽),图片宽适应(将图片设置成和父容器一样宽)
              image.css("width","100%");
              image.css("height","auto");
              
           }
        });
     });

     /**
     * 放大缩小图片
     * @param param 1=放大,-1=缩小
     */
    function scale(param){    

      if(scaleNum>10&&param>0){
        alert("已经放大到最大了!");
        return;
      }
      if(scaleNum<0.1&&param<0){
        alert("已经缩小到最小了!")
        return;
      }
      scaleNum=scaleNum+0.1*param
      //transform方法会取全局变量scaleNum
      transform();
    }

     /**
     * 旋转图片
     * @param param 1=右转90度,-1=左转90度
     */
     function rotate(param){
        rotateNum=rotateNum+90*param;
        if(rotateNum>=360){
            rotateNum=rotateNum-360;
        }
        if(rotateNum<=-360){
            rotateNum=rotateNum+360;
        }
        //旋转图片
        transform();
        //自适应
        adapt('a');
     }

     /**
     * 图片适应
     * @param param w=宽适度,h=高适应,其他值=自适应
     */
     function adapt(param){
        var parentDom=$("#parent");
        var img=$("#image");
       
        //图片处于左旋转或右旋转状态下时,
        if(rotateNum/90%2!==0){
           if(param.toLowerCase()==='w') {
              //宽适应:将图片旋转之后的宽度(即图片原来的高度),设置成父容器的宽度
              scaleNum = parentDom.width() / img.height();
           }else if(param.toLowerCase()==='h') {
              //高适应,将图片旋转之后的高度(即图片原来的宽度),设置成父容器的高度
              scaleNum=parentDom.height()/img.width();
           }else {
              // 注意:旋转之后的高是图片原来的宽,旋转之后的宽是图片原来的高
              if (img.width() / img.height() >= parentDom.height() / parentDom.width()) {
                 //图片旋转之后的高宽比大于父容器高宽比时(宽度一样时,旋转之后的图片比父容器高),图片高适应
                 adapt('h');
                 return;
              } else {
                 //图片旋转之后的高宽比小于父容器高宽比时(高度一样时,旋转之后的图片比父容器宽),图片宽适应
                 adapt('w');
                 return;
              }
           }
        }else{
           //未旋转或处于倒置状态下,
           if(param.toLowerCase()==='w') {
              //宽适应:图片的宽度等于父容器的宽度
              scaleNum = parentDom.width() / img.width();
           }else if(param.toLowerCase()==='h') {
              //高适应:图片的高度等于父容器的高度
              scaleNum=parentDom.height()/img.height();
           }else {
              if (img.height() / img.width() >= parentDom.height() / parentDom.width()) {
                 //图片高宽比大于父容器高宽比时(宽度一样时,图片比父容器高),图片高适应,代码同上
                 adapt('h');
                 return;
              } else {
                 //图片高宽比小于父容器高宽比时(高度一样时,图片比父容器宽),图片宽适应,代码同上
                 adapt('w');
                 return;
              }
           }
        }
        transform();
     }


    /**
     * 图片变化
     * */
    function transform(){
      var img=$("#image");
      var transform="";
      var parentDom=$("#parent");
      if(scaleNum!==1){
        if(scaleNum>1){
          //放大后图片左侧和右侧超过父容器处理,向右或向下移动到和父容器对齐  
          if(rotateNum/90%2===0){
            //未旋转或处于倒置状态下
            var offsetX=img.width()*scaleNum-parentDom.width();
            if(offsetX>0){                
              transform=transform+" translateX("+offsetX/2+"px) ";
            }
            var offsetY=img.height()*scaleNum-parentDom.height();
            if(offsetY>0){
              transform=transform+" translateY("+offsetY/2+"px) ";
            }
          }else{
            //处于左旋转或右旋转状态下
            var offsetX=img.height()*scaleNum-parentDom.width();
            if(offsetX>0){
              transform=transform+" translateX("+offsetX/2+"px) ";
            }
            var offsetY=img.width()*scaleNum-parentDom.height();
            if(offsetY>0){
              transform=transform+" translateY("+offsetY/2+"px) ";
            }
          }
        }
        //按全局变量缩放
        transform=transform+" scale("+scaleNum+") ";
      }
      //旋转
      if(rotateNum!==0) {
        transform = transform + "rotate(" + rotateNum + "deg) ";
      }
      img.css("transform",transform);
    }
  </script>

注意:jquery.js的版本不同,用$("#parent").height()和$("#parent").width()语法取父容器的高宽返回的值也不同,有的版本是包含滚动条的宽度的,有的则不包含。如果发现高适应(宽适应)后垂直(水平)方向仍有可滚动的滚动条,那么在计算父容器的高宽时,需要减去滚动条的宽度,即把代码中的$("#parent").height()全部换成($("#parent").height()-18),$("#parent").width()全部换成($("#parent").width()-18),注意加上括号。

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
实现图片的缩放、移动和旋转,可以利用HTML5中的canvas元素和JavaScript实现。具体的步骤如下: 1. 在HTML中创建canvas元素,并设置它的宽度和高度,以及一个放置图片的容器元素。 ```html <canvas id="myCanvas" width="500" height="500"></canvas> <div id="image-container"></div> ``` 2. 在JavaScript中,获取canvas元素和容器元素,并创建一个Image对象来加载图片。 ```javascript var canvas = document.getElementById("myCanvas"); var ctx = canvas.getContext("2d"); var img = new Image(); img.onload = function() { // 图片加载完成后执行以下代码 }; img.src = "path/to/image.jpg"; ``` 3. 在Image对象加载完成后,将它绘制到canvas上,并将canvas中的图像转换为一个可缩放、可旋转、可拖动的对象。 ```javascript var container = document.getElementById("image-container"); var imageObject = { x: canvas.width / 2, // 图片中心点的x坐标 y: canvas.height / 2, // 图片中心点的y坐标 width: img.width, // 图片的宽度 height: img.height, // 图片的高度 angle: 0, // 图片的旋转角度,单位为弧度 scale: 1 // 图片的缩放比例 }; // 将图片绘制到canvas上 ctx.drawImage(img, 0, 0); // 将canvas中的图像转换为一个可缩放、可旋转、可拖动的对象 var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); container.style.width = canvas.width + "px"; container.style.height = canvas.height + "px"; container.style.backgroundImage = "url(" + canvas.toDataURL() + ")"; container.style.backgroundSize = "100% 100%"; ``` 4. 实现图片的缩放、移动和旋转功能。对于缩放旋转,可以利用CSS3的transform属性来实现;对于移动,可以通过修改图片对象的x和y属性来实现。 ```javascript // 缩放图片 function zoomImage(scale) { imageObject.scale *= scale; container.style.transform = "rotate(" + imageObject.angle + "rad) scale(" + imageObject.scale + ")"; } // 旋转图片 function rotateImage(angle) { imageObject.angle += angle; container.style.transform = "rotate(" + imageObject.angle + "rad) scale(" + imageObject.scale + ")"; } // 移动图片 function moveImage(dx, dy) { imageObject.x += dx; imageObject.y += dy; container.style.left = imageObject.x - imageObject.width / 2 + "px"; container.style.top = imageObject.y - imageObject.height / 2 + "px"; } ``` 以上代码仅为示例,具体实现方式可能会因具体需求而有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成昆大侠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值