缩放/缩放后如何在Canvas中拖动图像/对象?

以下是我的完整代码。根据此链接编辑的内容如何在Canvas中拖动图像/对象?

要求 :

基本上我正在做的是,首先我要在canvg的帮助下使用drawSvg在画布上绘制SVG文件。

在此文件上,我正在通过markers.js中存在的JSON绘制图像(green1.png和orange1.png)。

方案1:

如果我平移而没有缩放比例,则可以拖动这些图像(green1.png,orange1.png)并能够正确平移画布。

但是,如果我在平移后进行缩放,则由于panX和panY点,图像无法在正确的位置平移。但是panX和panY是我们想要平移的要点。

方案2::

如果先缩放/缩放,然后平移,则图像(orange1.png,green1.png)会改变其位置,而无法拖动图像(orange1.png,green1.png)。

在这些情况下可以做什么?

HTML代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>      
        <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
        <style>
            canvas {
                border:1px solid #000
            }
            .tooltip{
                *position:fixed;
                position:absolute;
                *background:#ff7;
                background:green;
                border:1px solid #000;
                padding:7px;
                font-family:sans-serif;
                font-size:12px;
            }
            .tooltip2  {
                *position:fixed;
                position:absolute;
                background:pink;
                border:1px solid #000;
                padding:7px;
                font-family:sans-serif;
                font-size:12px;
            }
        </style>        
    </head>
    <body>
    <script src="http://canvg.googlecode.com/svn/trunk/rgbcolor.js"></script> 
    <script src="http://canvg.googlecode.com/svn/trunk/StackBlur.js"></script>
    <script src="http://canvg.googlecode.com/svn/trunk/canvg.js"></script>

    <canvas id="myCanvas" width="800" height="700" style="border: 1px solid;margin-top: 10px;"></canvas>
    <div id="buttonWrapper">
        <input type="button" id="plus" value="+">
        <input type="button" id="minus" value="-">
        <input type="button" id="original_size" value="100%">       
    </div>  
    <script src="/static/js/markers.js"></script>
    <script src="/static/js/draw.js"></script>


    </body>
</html>

draw.js:

var dataJSON = data || [];
var dataJSON2 = data2 || [];
window.onload = function(){ 
  //$(function(){              
    var canvas=document.getElementById("myCanvas");
    var ctx=canvas.getContext("2d");        

    var canvasOffset=$("#myCanvas").offset();
    var offsetX=canvasOffset.left;
    var offsetY=canvasOffset.top;

    var lastX=0;
    var lastY=0;
    var panX=0;
    var panY=0;
    var dragging=[];
    var dragging2=[];
    var isDown=false;

    function loadImages(sources, callback){
      var images = {};
      var loadImages = 0;
      var numImages = 0;
      //get num of sources
      for(var i in sources){            
        numImages++;
      }
      for(var i in sources){            
        images[i] = new Image();
        images[i].onload = function(){
          if(++loadImages >= numImages){
            callback(images);
          }
        };
        images[i].src = sources[i];            
      }
    }

    var sources = {orange : '/static/images/orange1.png', green : '/static/images/green1.png'};


    // load the tiger image
    var svgfiles = ["/static/images/awesome_tiger.svg"];
    /*var tiger=new Image();
    tiger.onload=function(){
      draw();
    }
     tiger.src="tiger.png";*/

    function draw(scaleValue){ 
      ctx.clearRect(0,0,canvas.width,canvas.height);    
      ctx.save();
      ctx.drawSvg(svgfiles[0],panX,panY,400*scaleValue, 400*scaleValue);         
      //ctx.drawImage(tiger,panX,panY,tiger.width,tiger.height);    
       //ctx.scale(scaleValue, scaleValue);
      loadImages(sources, function(images){     
        ctx.scale(scaleValue, scaleValue);
        for(var i = 0, pos; pos = dataJSON[i]; i++) {            
          ctx.drawImage(images.orange, parseInt(parseInt(pos.x) + parseInt(panX)), parseInt(parseInt(pos.y) + parseInt(panY)), 20/scaleValue, 20/scaleValue);               
        }
        for(var i = 0, pos; pos = dataJSON2[i]; i++) {            
          ctx.drawImage(images.green, parseInt(parseInt(pos.x) + parseInt(panX)), parseInt(parseInt(pos.y) + parseInt(panY)), 20/scaleValue, 20/scaleValue);             
        }
        ctx.restore();
      });

    };
    var scaleValue = 1;
    var scaleMultiplier = 0.8;
    draw(scaleValue);
    var startDragOffset = {};
    var mouseDown = false;          
    // add button event listeners
    document.getElementById("plus").addEventListener("click", function(){           
        scaleValue /= scaleMultiplier;  
        //checkboxZoomPan();            
        draw(scaleValue);               
    }, false);
     document.getElementById("minus").addEventListener("click", function(){
        scaleValue *= scaleMultiplier;
        //checkboxZoomPan();            
        draw(scaleValue);       
    }, false);
    document.getElementById("original_size").addEventListener("click", function(){
        scaleValue = 1;
        //checkboxZoomPan();            
        draw(scaleValue);   
    }, false);


    // create an array of any "hit" colored-images
    function imagesHitTests(x,y){   
      // adjust for panning
      x-=panX;
      y-=panY;
      // create var to hold any hits
      var hits=[];
      // hit-test each image
      // add hits to hits[]
      loadImages(sources, function(images){
        for(var i = 0, pos; pos = dataJSON[i]; i++) { 
          if(x >= parseInt(pos.x * scaleValue) && x <= parseInt((pos.x * scaleValue) + 20) && y >= parseInt(pos.y * scaleValue) && y <= parseInt((pos.y * scaleValue) + 20)){
            hits.push(i);           
          }              
        }            
      });          
      return(hits);
    }

    function imagesHitTests2(x,y){      
      // adjust for panning
      //x-=panX;
      //x = parseInt(x) - parseInt(panX);     
     // y-=panY;
     x-=panX;
     y-=panY;
      // create var to hold any hits
      var hits2=[];
      // hit-test each image
      // add hits to hits[]
      loadImages(sources, function(images){            
        for(var i = 0, pos; pos = dataJSON2[i]; i++) {          
          //if(x > pos.x && x < parseInt(parseInt(pos.x) + parseInt(20)) && y > pos.y && y < parseInt(parseInt(pos.y) + parseInt(20))){
          if(x >= parseInt(pos.x * scaleValue) && x <= parseInt((pos.x * scaleValue) + 20) && y >= parseInt(pos.y * scaleValue) && y <= parseInt((pos.y * scaleValue) + 20)){           
            hits2.push(i);          
          }              
        }            
      });          
      return(hits2);
    }

    function handleMouseDown(e){
      // get mouse coordinates
      mouseX=parseInt(e.clientX-offsetX);
      mouseY=parseInt(e.clientY-offsetY);
      // set the starting drag position
      lastX=mouseX;
      lastY=mouseY;
      // test if we're over any of the images
      dragging=imagesHitTests(mouseX,mouseY);
      dragging2=imagesHitTests2(mouseX,mouseY);
      // set the dragging flag    
      isDown=true;
    }

    function handleMouseUp(e){
      // clear the dragging flag
      isDown=false;
    }

    function handleMouseMove(e){
      // if we're not dragging, exit
      if(!isDown){
        return;
      }

      //get mouse coordinates
      mouseX=parseInt(e.clientX-offsetX);
      mouseY=parseInt(e.clientY-offsetY);

      // calc how much the mouse has moved since we were last here
      var dx=mouseX-lastX;
      var dy=mouseY-lastY;

      // set the lastXY for next time we're here
      lastX=mouseX;
      lastY=mouseY;

      // handle drags/pans
      if(dragging.length>0){      
        // we're dragging images
        // move all affected images by how much the mouse has moved            
        for(var i = 0, pos; pos = dataJSON[dragging[i]]; i++) {              
          pos.x = parseInt(pos.x) + parseInt(dx);
          pos.y = parseInt(pos.y) + parseInt(dy);              
        }
      }
      else if(dragging2.length>0){      
        for(var i = 0, pos1; pos1 = dataJSON2[dragging2[i]]; i++) {              
          pos1.x = parseInt(pos1.x) + parseInt(dx);              
          pos1.y = parseInt(pos1.y) + parseInt(dy);
        }            
      }
      else{
        // we're panning the tiger
        // set the panXY by how much the mouse has moved
        panX+=dx;
        panY+=dy;
      }
      draw(scaleValue);
    }


    // use jQuery to handle mouse events
    $("#myCanvas").mousedown(function(e){handleMouseDown(e);});
    $("#myCanvas").mousemove(function(e){handleMouseMove(e);});
    $("#myCanvas").mouseup(function(e){handleMouseUp(e);});

// }); // end $(function(){});
  }

markers.js:

data = [  
        {   "id" :["first"],        
            "x": ["195"],
            "y": ["150"],
            "tooltiptxt": ["Region 1"]

        },  
        {
            "id" :["second"],
            "x": ["255"],
            "y": ["180"],
            "tooltiptxt": ["Region 2"]      
        },
        {
            "id" :["third"],
            "x": ["200"],
            "y": ["240"],
            "tooltiptxt": ["Region 3"]      
        }       

    ];

data2 = [  
        {   "id" :["first2"],       
            "x": ["225"],
            "y": ["150"],
            "tooltiptxt": ["Region 21"]

        },  
        {
            "id" :["second2"],
            "x": ["275"],
            "y": ["180"],
            "tooltiptxt": ["Region 22"]     
        },
        {
            "id" :["third3"],
            "x": ["300"],
            "y": ["240"],
            "tooltiptxt": ["Region 23"]     
        }       

    ];
十亿字节

1.)positionX * xScale和positionY * yScale

2.)在绘图功能中尝试此代码

ctx.drawImage(images.orange, parseInt(parseInt(pos.x) + parseInt(panX / scaleValue)), parseInt(parseInt(pos.y) + parseInt(panY / scaleValue)), 20/scaleValue, 20/scaleValue);               

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Canvas中拖动图像/对象?

来自分类Dev

如何在ffmpeg中缩放覆盖图像

来自分类Dev

如何在div中缩放图像行

来自分类Dev

如何在 React Native 中缩放图像?

来自分类Dev

缩放图像后如何将图像限制在容器中?

来自分类Dev

缩放(Flutter)后如何在小部件(图像)周围移动?

来自分类Dev

ImageJ API:如何在图像窗口中显示具有缩放和拖动以滚动功能的图像?

来自分类Dev

如何拖动缩放的元素

来自分类Dev

在fabricjs中缩放后如何进行图像转换?

来自分类Dev

如何缩放画布中的图像?

来自分类Dev

如何通过拖动图像的边缘来移动和缩放图像?

来自分类Dev

如何在React Native中自动缩放图像?

来自分类Dev

如何在预定义的矩形中显示图像的缩放部分?

来自分类Dev

如何在fineuploader中仅显示1个缩放的图像

来自分类Dev

如何在java中的缩放图像之上绘制?

来自分类Dev

选中后如何缩放CollectionviewCell图像?

来自分类Dev

选中后如何缩放CollectionviewCell图像?

来自分类Dev

在pygame中缩放图像后颜色错误

来自分类Dev

如何设置背景图像进行缩放和拖动?

来自分类Dev

如何捕获开始拖动,平移或缩放后触发的地图事件?

来自分类Dev

如何在ImageView中缩放自己的可绘制对象

来自分类Dev

如何在PixiJS中通过全局坐标缩放图形对象?

来自分类Dev

拖动后动态更改jquery中缩放比例的转换原点

来自分类Dev

如何缩放 Canvas 形状?

来自分类Dev

如何在Bing Maps 7.0中实现“缩放”和“拖动”功能?

来自分类Dev

如何在缩放的图像上绘制?

来自分类Dev

如何在 Laravel 中提供缩放图像?

来自分类Dev

如何在概览窗格中移动(拖动)缩放的图形?

来自分类Dev

如何在 Java 中缩放/缩放 Android WebView

Related 相关文章

  1. 1

    如何在Canvas中拖动图像/对象?

  2. 2

    如何在ffmpeg中缩放覆盖图像

  3. 3

    如何在div中缩放图像行

  4. 4

    如何在 React Native 中缩放图像?

  5. 5

    缩放图像后如何将图像限制在容器中?

  6. 6

    缩放(Flutter)后如何在小部件(图像)周围移动?

  7. 7

    ImageJ API:如何在图像窗口中显示具有缩放和拖动以滚动功能的图像?

  8. 8

    如何拖动缩放的元素

  9. 9

    在fabricjs中缩放后如何进行图像转换?

  10. 10

    如何缩放画布中的图像?

  11. 11

    如何通过拖动图像的边缘来移动和缩放图像?

  12. 12

    如何在React Native中自动缩放图像?

  13. 13

    如何在预定义的矩形中显示图像的缩放部分?

  14. 14

    如何在fineuploader中仅显示1个缩放的图像

  15. 15

    如何在java中的缩放图像之上绘制?

  16. 16

    选中后如何缩放CollectionviewCell图像?

  17. 17

    选中后如何缩放CollectionviewCell图像?

  18. 18

    在pygame中缩放图像后颜色错误

  19. 19

    如何设置背景图像进行缩放和拖动?

  20. 20

    如何捕获开始拖动,平移或缩放后触发的地图事件?

  21. 21

    如何在ImageView中缩放自己的可绘制对象

  22. 22

    如何在PixiJS中通过全局坐标缩放图形对象?

  23. 23

    拖动后动态更改jquery中缩放比例的转换原点

  24. 24

    如何缩放 Canvas 形状?

  25. 25

    如何在Bing Maps 7.0中实现“缩放”和“拖动”功能?

  26. 26

    如何在缩放的图像上绘制?

  27. 27

    如何在 Laravel 中提供缩放图像?

  28. 28

    如何在概览窗格中移动(拖动)缩放的图形?

  29. 29

    如何在 Java 中缩放/缩放 Android WebView

热门标签

归档