注意:transform的scale为负数时,图片会垂直翻转
一、在使用transform将计算得到的变化应用到图片上后,需要考虑到我们每次计算的都是touchmove中本次的差量。在第一次移动过后。当进行第二次移动时,我们需要在第一次移动的位置基础上再次进行差量移动,所以首先需要创建一个公共变量来存储上次的位置。所以需要我们在每次touchstart的时候通过window.getComputedStyle(document.getElementById('div_bg_img'), null)
获取到当前图片的css属性,来获取到tranform当前的位置并赋值给公共对象。而且在touchmove的时候,每次赋值给图片transform属性时,需要在公共对象的基础上进行变化
$el.css('transform', `translate3d(${dragTrans.x + transform.x}px,${dragTrans.y + transform.y}px,0px) rotate(${dragTrans.rotate + transform.rotate}deg) scale(${dragTrans.scale * transform.scale})`);
 
二、canvas画布的transform
canvas的transform和图片tranform不一致,主要是canvas的transform永远以画布左上角原点为中心而csstransform可以以图片中心为原点。
所以canvas的图片缩放和旋转都需要做相应的调整。
eg:canvas实现中心旋转:
ctx.translate(width / 2, height / 2 );
ctx.rotate(angle * Math.PI / 180);
ctx.translate(-width / 2,-height / 2 ); eg:canvas实现中心缩放:
ctx.translate(width / 2 * (1 - scaleX), height / 2 * (1 - scaleY));
ctx.scale(scaleX, scaleY);
 
 
三、eg:截取部分我的代码(处理canvas画布旋转加缩放)
ctx.clearRect(0, 0, bg2.width * imageQuality, bg2.height * imageQuality);
let diagonalPointX = (width/2 + trans.x);
let diagonalPointY = (height/2 + trans.y);
preRotate = trans.rotate;
ctx.translate(diagonalPointX * imageQuality, diagonalPointY * imageQuality);
ctx.rotate(trans.rotate*Math.PI/180);
ctx.translate((-width / 2 + (1 - trans.scale) * width / 2) * imageQuality, (-height / 2 + (1 - trans.scale) * height / 2) * imageQuality );
ctx.scale(trans.scale, trans.scale);
if (orientation == 6){
ctx.rotate(90 * Math.PI / 180);
ctx.translate(0, -width * imageQuality);
ctx.drawImage(pure_img, 0, 0, height * imageQuality, width * imageQuality);
}
else{
ctx.drawImage(pure_img, 0, 0, width * imageQuality, height * imageQuality);
}
 
 

前端手势控制图片插件书写三(将transform变化应用在图片和canvas画布上)的更多相关文章

  1. 前端手势控制图片插件书写二(transform矩阵的原理)

    上次解释了如何使用代码识别双指和单指操作及放大和旋转拖动操作.这次解释下css3的transform原理 一.transform矩阵原理 transform: matrix(a,b,c,d,e,f) ...

  2. 前端手势控制图片插件书写四(图片上传及Ios图片方向问题)

    1.在图片上传中,使用的input的type为File的属性.使用filereader的Api let that = this; var file = document.getElementById( ...

  3. 前端总结·基础篇·CSS(三)补充

    前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 目录 一.移动端 1.1 视口(viewport) 1.2 媒体查询(medi ...

  4. Swift实战-豆瓣电台(九)简单手势控制暂停播放(全文完)

    Swift实战-豆瓣电台(九)简单手势控制暂停播放 全屏清晰观看地址:http://www.tudou.com/programs/view/tANnovvxR8U/ 这节我们主要讲UITapGestu ...

  5. JQuery开发之Galleriffic图片插件介绍

    Galleriffic是一个用于创建快速展示相册中照片的jQuery插件.从图一中可以看成,图片既可以以幻灯片的方式查看,也可以手动点击缩略图查看.Galleriffic还支持分页,从而使得它能够展示 ...

  6. Unity3D中使用Leap Motion进行手势控制

    Leap Motion作为一款手势识别设备,相比于Kniect,长处在于准确度. 在我的毕业设计<场景漫游器>的开发中.Leap Motion的手势控制作为重要的一个环节.以此,谈谈开发中 ...

  7. cropper(裁剪图片)插件使用(案例)

    公司发布微信H5前端阵子刚刚弄好的H5端的图片上传插件,现在有需要裁剪图片.前端找了一个插件---cropper 本人对这插件不怎么熟悉,这个案例最好用在一个页面只有一个上传图片的功能上而且只适合单个 ...

  8. Grunt中批量无损压缩图片插件--Grunt-contrib-imagemin

    Photoshop 切出的图片,无论是 PNG 还是 JPEG/JPG 格式,都含有许多相关信息,又或多余的颜色值,这些信息和颜色值,对网页前端并没有用处,反而增加图片大小,所以 Google Pag ...

  9. 猫猫学iOS之小知识之_xcode插件的删除方法_自己主动提示图片插件KSImageNamed有时不灵_分类或宏之类不能自己主动提示,

    猫猫分享,必须精品 原创文章.欢迎转载. 转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:解决解决自己主动提示图片插件KSImageNamed有时不 ...

随机推荐

  1. Node.js 调试小技巧

    小技巧--使用 supervisor如果你有 PHP 开发经验,会习惯在修改 PHP 脚本后直接刷新浏览器以观察结果,而你在开发 Node.js 实现的 HTTP 应用时会发现,无论你修改了代码的哪一 ...

  2. How to connect oracle databse

    1. 下載客戶端Oracle Developer Tools for Visual Studio_32bit 安裝后通過配置tnsnames.ora指定連接 C:\app\user name\prod ...

  3. phpweb文件上传下载

    PHP用超级全局变量数组$_FILES来记录文件上传相关信息的. 1.file_uploads=on/off 是否允许通过http方式上传文件 2.max_execution_time=30 允许脚本 ...

  4. mapreduce 倒序 排序 最简单 易上手

    对于mapreduce倒序只需要建立一个类,然后继承WritableComparator 在重写 Compare函数最后在main里调用一下,就可以实现倒序排序: 代码: public static ...

  5. jsp显示当前系统时间

    第一种方式: <% java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat( "yyy ...

  6. Java学习日记——基础篇(一)常识

    JAVA简介 Java的标准 Java是一种语言,一个平台包含JavaSE.JavaEE.JavaME三个版本 JavaSE标准版(属于Java的基础部分,可以开发C/S构架的桌面应用程序) Java ...

  7. kafka - Confluent.Kafka

    上个章节我们讲了kafka的环境安装(这里),现在主要来了解下Kafka使用,基于.net实现kafka的消息队列应用,本文用的是Confluent.Kafka,版本0.11.6 1.安装: 在NuG ...

  8. 【Robot Framework 项目实战 04】基于录制,生成RF关键字及 自动化用例

    背景 因为服务的迁移,Jira版本的更新,很多接口文档的维护变少,导致想要编写部分服务的自动化测试变得尤为麻烦,很多服务,尤其是客户端接口需要通过抓包的方式查询参数来编写自动化用例,但是过程中手工重复 ...

  9. maven在整合springmvc+hibernate运行时遇到的一些问题

    在这里大概记录一下自己在搭建的时候遇到的一些小问题. 1,在获取hibernate的sessionFactory对象时报空指针异常,我的常规配置如下:

  10. javascript-类型、值和变量

    基本类型和引用类型 MDN-JavaScript 数据类型和数据结构 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是 简单的数据段,而引用类型值指那些 ...