搜索
首页web前端H5教程详解如何用HTML5 Canvas API控制图片的缩放变换_html5教程技巧

缩放变换scale(sx,sy)传入两个参数,分别是水平方向和垂直方向上对象的缩放倍数。例如context.scale(2,2)就是对图像放大两倍。其实,看上去简单,实际用起来还是有一些问题的。我们来看一段代码:

JavaScript Code复制内容到剪贴板
  1. nbsp;html>   
  2. "zh">   
  3.   
  4.      "UTF-8">   
  5.     缩放变换   
  6.     
  7.         body { background: url("./images/bg3.jpg") repeat; }  
  8.         #canvas { border: 1px solid #aaaaaa; display: block; margin: 50px auto; }   
  9.        
  10.   
  11.   
  12. "canvas-warp">   
  13.     "canvas">   
  14.         你的浏览器居然不支持Canvas?!赶快换一个吧!!   
  15.        
  
  •   
  • <script> </script>
  •     window.onload = function(){   
  •         var canvas = document.getElementById("canvas");   
  •         canvas.width = 800;   
  •         canvas.height = 600;   
  •         var context = canvas.getContext("2d");   
  •         context.fillStyle = "#FFF";   
  •         context.fillRect(0,0,800,600);   
  •   
  •         context.strokeStyle = "red";   
  •         context.lineWidth = 5;   
  •         for(var i = 1; i 
  •             context.save();   
  •             context.scale(i,i);   
  •             context.strokeRect(50,50,150,100);   
  •             context.restore();   
  •         }   
  •     };   
  •   
  •   
  •   
  • 运行结果:
    2016322115330220.jpg (850×500)

     其实缩放很简单,稍微复杂的是,如何让鼠标成为放大或者缩小的中心。如果数学几何不好,计算公式就可能看不明白了。

    JavaScript Code复制内容到剪贴板
    1. canvas.onmousewheel=canvas.onwheel=function(event){//chrome firefox浏览器兼容   
    2.     var pos=windowToCanvas(canvas,event.clientX,event.clientY);   
    3.     event.wheelDelta=event.wheelDelta?event.wheelDelta:(event.deltaY*(-40));   
    4.     if(event.wheelDelta>0){   
    5.         imgScale*=2;   
    6.         imgX=imgX*2-pos.x;   
    7.         imgY=imgY*2-pos.y;   
    8.     }else{   
    9.         imgScale/=2;   
    10.         imgX=imgX*0.5+pos.x*0.5;   
    11.         imgY=imgY*0.5+pos.y*0.5;   
    12.     }   
    13.     drawImage();   
    14. }  

      这个时候,基本功能就实现了,加载一张图片和加载多张图片都差不多,维护每一张图片的位置和大小,下面来整理一下代码吧。

    JavaScript Code复制内容到剪贴板
    1. var canvas,context;   
    2. var img,//图片对象   
    3.     imgIsLoaded,//图片是否加载完成;   
    4.     imgX=0,   
    5.     imgY=0,   
    6.     imgScale=1;   
    7.     
    8. (function int(){   
    9.     canvas=document.getElementById('canvas');   
    10.     context=canvas.getContext('2d');   
    11.     loadImg();   
    12. })();   
    13.     
    14. function loadImg(){   
    15.     img=new Image();   
    16.     img.onload=function(){   
    17.         imgIsLoaded=true;   
    18.         drawImage();   
    19.     }   
    20.     img.src="map.jpg";   
    21. }   
    22.     
    23. function drawImage(){   
    24.     context.clearRect(0,0,canvas.width,canvas.height);   
    25.     context.drawImage(img,0,0,img.width,img.height,imgX,imgY,img.width*imgScale,img.height*imgScale);   
    26. }   
    27.     
    28. canvas.onmousedown=function(event){   
    29.     var pos=windowToCanvas(canvas,event.clientX,event.clientY);   
    30.     canvas.onmousemove=function(event){   
    31.         canvas.style.cursor="move";   
    32.         var pos1=windowToCanvas(canvas,event.clientX,event.clientY);   
    33.         var x=pos1.x-pos.x;   
    34.         var y=pos1.y-pos.y;   
    35.         pos=pos1;   
    36.         imgX+=x;   
    37.         imgY+=y;   
    38.         drawImage();   
    39.     }   
    40.     canvas.onmouseup=function(){   
    41.         canvas.onmousemove=null;   
    42.         canvas.onmouseup=null;   
    43.         canvas.style.cursor="default";   
    44.     }   
    45. }   
    46. canvas.onmousewheel=canvas.onwheel=function(event){   
    47.     var pos=windowToCanvas(canvas,event.clientX,event.clientY);   
    48.     event.wheelDelta=event.wheelDelta?event.wheelDelta:(event.deltaY*(-40));   
    49.     if(event.wheelDelta>0){   
    50.         imgScale*=2;   
    51.         imgX=imgX*2-pos.x;   
    52.         imgY=imgY*2-pos.y;   
    53.     }else{   
    54.         imgScale/=2;   
    55.         imgX=imgX*0.5+pos.x*0.5;   
    56.         imgY=imgY*0.5+pos.y*0.5;   
    57.     }   
    58.     drawImage();   
    59. }   
    60.     
    61. function windowToCanvas(canvas,x,y){   
    62.     var bbox = canvas.getBoundingClientRect();   
    63.     return {   
    64.         x:x - bbox.left - (bbox.width - canvas.width) / 2,   
    65.         y:y - bbox.top - (bbox.height - canvas.height) / 2   
    66.     };   
    67. }  

    缩放变换应注意的问题
    看了上面的例子,大家一定对产生的结果有点奇怪。一是左上角顶点的坐标变了,而是线条的粗细也变了。因此,对于缩放变换有两点问题需要注意:

    缩放时,图像左上角坐标的位置也会对应缩放。
    缩放时,图像线条的粗细也会对应缩放。
    比如对于最小的那个原始矩形,它左上角的坐标是(50,50),线条宽度是5px,但是放大2倍后,左上角坐标变成了(100,100),线条宽度变成了10px。这就是缩放变换的副作用。

    童鞋们一定在期待着我说解决副作用的途径。很遗憾,没有什么好的方法去解决这些副作用。如果想固定左上角坐标缩放,可以把左上角坐标变成(0,0),这样的话无论是什么倍数,0乘上它还是0,所以不变。如果不想让线条粗细变化,那就别使用线条。或者自己封装一个函数,不要使用scale()。

    究其根本,之前我们说过平移变换、旋转变换、缩放变换都属于坐标变换,或者说是画布变换。因此,缩放并非缩放的是图像,而是整个坐标系、整个画布!就像是对坐标系的单位距离缩放了一样,所以坐标和线条都会进行缩放。仔细想想,这一切貌似挺神奇的。

    声明
    本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
    H5和HTML5:网络开发中常用的术语H5和HTML5:网络开发中常用的术语Apr 13, 2025 am 12:01 AM

    H5与HTML5指的是同一个东西,即HTML5。HTML5是HTML的第五个版本,带来了语义化标签、多媒体支持、画布与图形、离线存储与本地存储等新功能,提升了网页的表现力和交互性。

    H5指的是什么?探索上下文H5指的是什么?探索上下文Apr 12, 2025 am 12:03 AM

    H5referstoHTML5,apivotaltechnologyinwebdevelopment.1)HTML5introducesnewelementsandAPIsforrich,dynamicwebapplications.2)Itsupportsmultimediawithoutplugins,enhancinguserexperienceacrossdevices.3)SemanticelementsimprovecontentstructureandSEO.4)H5'srespo

    H5:工具,框架和最佳实践H5:工具,框架和最佳实践Apr 11, 2025 am 12:11 AM

    H5开发需要掌握的工具和框架包括Vue.js、React和Webpack。1.Vue.js适用于构建用户界面,支持组件化开发。2.React通过虚拟DOM优化页面渲染,适合复杂应用。3.Webpack用于模块打包,优化资源加载。

    HTML5的遗产:当前了解H5HTML5的遗产:当前了解H5Apr 10, 2025 am 09:28 AM

    HTML5hassignificantlytransformedwebdevelopmentbyintroducingsemanticelements,enhancingmultimediasupport,andimprovingperformance.1)ItmadewebsitesmoreaccessibleandSEO-friendlywithsemanticelementslike,,and.2)HTML5introducednativeandtags,eliminatingthenee

    H5代码:可访问性和语义HTMLH5代码:可访问性和语义HTMLApr 09, 2025 am 12:05 AM

    H5通过语义化元素和ARIA属性提升网页的可访问性和SEO效果。1.使用、、等元素组织内容结构,提高SEO。2.ARIA属性如aria-label增强可访问性,辅助技术用户可顺利使用网页。

    H5与HTML5相同吗?H5与HTML5相同吗?Apr 08, 2025 am 12:16 AM

    "h5"和"HTML5"在大多数情况下是相同的,但它们在某些特定场景下可能有不同的含义。1."HTML5"是W3C定义的标准,包含新标签和API。2."h5"通常是HTML5的简称,但在移动开发中可能指基于HTML5的框架。理解这些区别有助于在项目中准确使用这些术语。

    H5的功能是什么?H5的功能是什么?Apr 07, 2025 am 12:10 AM

    H5,即HTML5,是HTML的第五个版本,它为开发者提供了更强大的工具集,使得创建复杂的网页应用变得更加简单。H5的核心功能包括:1)元素允许在网页上绘制图形和动画;2)语义化标签如、等,使网页结构清晰,利于SEO优化;3)新API如GeolocationAPI,支持基于位置的服务;4)跨浏览器兼容性需要通过兼容性测试和Polyfill库来确保。

    h5链接怎么做h5链接怎么做Apr 06, 2025 pm 12:39 PM

    如何创建 H5 链接?确定链接目标:获取 H5 页面或应用程序的 URL。创建 HTML 锚点:使用 <a> 标记创建锚点并指定链接目标URL。设置链接属性(可选):根据需要设置 target、title 和 onclick 属性。添加到网页:将 HTML 锚点代码添加到希望链接出现的网页中。

    See all articles

    热AI工具

    Undresser.AI Undress

    Undresser.AI Undress

    人工智能驱动的应用程序,用于创建逼真的裸体照片

    AI Clothes Remover

    AI Clothes Remover

    用于从照片中去除衣服的在线人工智能工具。

    Undress AI Tool

    Undress AI Tool

    免费脱衣服图片

    Clothoff.io

    Clothoff.io

    AI脱衣机

    AI Hentai Generator

    AI Hentai Generator

    免费生成ai无尽的。

    热门文章

    R.E.P.O.能量晶体解释及其做什么(黄色晶体)
    3 周前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.最佳图形设置
    3 周前By尊渡假赌尊渡假赌尊渡假赌
    R.E.P.O.如果您听不到任何人,如何修复音频
    3 周前By尊渡假赌尊渡假赌尊渡假赌
    WWE 2K25:如何解锁Myrise中的所有内容
    4 周前By尊渡假赌尊渡假赌尊渡假赌

    热工具

    MinGW - 适用于 Windows 的极简 GNU

    MinGW - 适用于 Windows 的极简 GNU

    这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

    螳螂BT

    螳螂BT

    Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

    安全考试浏览器

    安全考试浏览器

    Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    Dreamweaver Mac版

    Dreamweaver Mac版

    视觉化网页开发工具