<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta content="initial-scale=1.0,maximum-scale=1.0,width=device-width" name="viewport">
<title>Document</title>
</head>
<body>

<style>

*
{
margin:0;
padding:0;
}
.content{
position:relative;
background:yellow;

}
.img
{

}
.selectContainer
{
position: absolute;
border:1px solid rgba(255,255,255,0.5);
border-radius: 50%;
}
#info
{
height:50px;
}
</style>

<div id="info"></div>
<input type="file" accept="image/*" id="selectFile" />
<div class="content" id="content">

<img alt="选择图片" class="img" id="selectImg"/>
<div class="selectContainer"></div>

</div>
<canvas id="canvas"> </canvas>

<script type="text/javascript" src="js/touch.min.js"></script>
<script type="text/javascript" src="js/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="js/hijs.js"></script>

<script>
var canvas = document.getElementById("canvas");
var context = canvas.getContext("2d");
canvas.width = 200;
canvas.height = 200;

var sWidth = document.documentElement.clientWidth;
var sHeight = document.documentElement.clientHeight;
var imgLength =200;
var selectLength = 100;
var cssScale = "";
var cssTransform = "";
var orignImage =new Image();
var height ;
var width ;
var orignHeight;
var orignWidth;
var maxHeight;
var maxWidth;
var maxScal;
var minScal;
var maxOffx;
var maxOffY;
var offx ;
var offy ;
var cutX;
var cutY;
var currentScale=1;
var target = document.getElementById("selectImg");
$("#selectFile").change(function(){

var file = this.files[0];
var fileReader = new FileReader();
fileReader.readAsDataURL(file);

fileReader.onload=function(){
orignImage.src=this.result;
orignHeight =height = orignImage.height;
orignWidth = width = orignImage.width;
if(height>imgLength&&width>imgLength)
{
if(height>width)
{
width = imgLength/height*width;
height = imgLength;
}
else
{
height=imgLength/width*height;
width = imgLength;
}

}else if(height>imgLength&&width<=imgLength)
{
width = imgLength/height*width;
height= imgLength;
}
else if(height<=imgLength&&width>imgLength)
{
height = imgLength/width*height;
width=imgLength;
}

$(".img").attr("src",this.result);
$(".img").width(width).height(height);
$(".img").css("margin","0 auto");
$(".img").css("display","block");
var selectBoderleft= (sWidth - selectLength)/2+"px";
var selectBoderTop = (height-selectLength)/2+"px";
$(".selectContainer").height(selectLength-2);
$(".selectContainer").width(selectLength-2);
$(".selectContainer").css("top",selectBoderTop);
$(".selectContainer").css("left",selectBoderleft);
maxScal=sWidth/imgLength;
minScal=selectLength/width;
maxOffx =(target.offsetWidth - selectLength)/2;
maxOffY =(target.offsetHeight - selectLength)/2;
$("#info").html("Y:"+target.offsetHeight);

}

})

$(function() { //放大缩小

target.style.webkitTransition = 'all ease 0.05s';
touch.on('#content', 'touchstart', function(ev) {
ev.preventDefault();
});
var initialScale = 1;

touch.on('#content', 'pinchend', function(ev) {
currentScale = ev.scale - 1;
currentScale = initialScale + currentScale;
currentScale = currentScale > maxScal ? maxScal : currentScale; //自己调节可以放大的最大倍数
currentScale = currentScale < minScal ? minScal : currentScale; //自己调节可以缩小的最小倍数
cssScale = 'scale(' + currentScale + ')'
target.style.webkitTransform = cssTransform+cssScale;
initialScale = currentScale;
maxOffx =(target.offsetWidth*currentScale - selectLength)/2;
maxOffY =(target.offsetHeight*currentScale - selectLength)/2;

});

});

$(function() {

touch.on('#selectImg', 'touchstart', function(ev) {
ev.preventDefault();
});

var dx, dy;
touch.on('#selectImg', 'drag', function(ev) {
dx = dx || 0;
dy = dy || 0;
offx = dx + ev.x ;
offy = dy + ev.y ;

if(offy>maxOffY)
{
offy=maxOffY
}
if(offy<-maxOffY)
{
offy=-maxOffY;
}
if(offx>maxOffx)
{
offx=maxOffx
}
if(offx<-maxOffx)
{
offx=-maxOffx;
}

cssTransform = "translate3d(" + offx + "px," + offy + "px,0)";

this.style.webkitTransform = cssTransform + cssScale;

cutX = ((width*currentScale- selectLength)/2-offx)*orignWidth/width;
cutY =((height*currentScale- selectLength)/2-offy)*orignHeight/height;
selectWidth = selectLength/currentScale;
selectHeight =selectLength/currentScale;
console.log(currentScale, target,cutX,cutY,selectWidth,selectHeight);
context.drawImage(orignImage,cutX,cutY,orignWidth*selectLength/currentScale/width,orignHeight*selectLength/currentScale/height,0,0,canvas.width,canvas.height);

$("#info").html("cux="+cutX +" cutY="+cutY);

});
touch.on('#selectImg', 'dragend', function(ev) {
dx += ev.x;
dy += ev.y;

});
})

</script>

</body>
</html>

mimi的更多相关文章

  1. 上传时excel类型accept的MIMI类型

    1.excel文件类型 accept='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/v ...

  2. WebSocket - ( 一.概述 )

    说到 WebSocket,不得不提 HTML5,作为近年来Web技术领域最大的改进与变化,包含CSS3.离线与存储.多媒体.连接性( Connectivity )等一系列领域,而即将介绍的 WebSo ...

  3. Oracle 内置sql函数大全

    F.1字符函数--返回字符值 这些函数全都接收的是字符族类型的参数(CHR除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.字符函数的返回类型所受的限制和基本数据 ...

  4. JavaScript面向对象和原型函数

    对象,是javascript中非常重要的一个梗,是否能透彻的理解它直接关系到你对整个javascript体系的基础理解,说白了,javascript就是一群对象在搅..(哔!). 常用的几种对象创建模 ...

  5. Java内部类的定义和使用

    为什么要用到内部类: 在java开发学习中我们经常会碰到内部类.内部类又有很多的优势:首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法名称参数相同,你应 ...

  6. JS 原型,检索,更新,引用等

    <script type="text/javascript"> var myObject=maker({ first:f, last:1, state:s, city: ...

  7. oracle函数大全(转载)

    F.1字符函数--返回字符值 这些函数全都接收的是字符族类型的参数(CHR除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.字符函数的返回类型所受的限制和基本数据 ...

  8. ipa如何通过网络进行安装

    苹果手机端应用,如果发布的到Appstore上,往往比较复杂,周期也比较长,Over-the-Air是Apple在 iOS4 中新加的一项技术,目的是让开发者能够脱离Appstore,实现从自己的服务 ...

  9. 12种不适宜使用的javascript语法

    1. == (o゜▽゜)o☆[BINGO!] Javascript有两组相等运算符,一组是==和!=,另一组是===和!==.前者只比较值的相等,后者除了值以外,还比较类型是否相同. 请尽量不要使用前 ...

随机推荐

  1. Unity Container

    Unity Container中的几种注册方式与示例 2013-12-08 22:43 by 小白哥哥, 22 阅读, 0 评论, 收藏, 编辑 1.实例注册 最简单的注册方式就是实例注册,Unity ...

  2. discuz 门户页模板中的keywords和description不能正常显示

    最近用discuz搭建了一个素食网,在处理门户页模板时,发现虽然在后台的seo设置了keywords和description,但是以游客的身份访问时,不显示后台设置的内容,显示为: <meta ...

  3. C#线程同步(转)

    线程同步 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行.对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件保持响应.对于服务器应用程序,多线程处理提供了用不 ...

  4. IceMx.Mvc 我的js MVC 框架六、完善植物大战僵尸(向日葵登场)

    有图有真相,废话不多说上图 看到园友的支持很受鼓舞,更觉得应该做下去,虽然自己是个菜鸟,但也应该共享自己的心得,只要有人获益那就是值得的. 我的下载需要csdn论坛的1个积分,之所以不完全免费出去是因 ...

  5. Python之FTP多线程下载文件之分块多线程文件合并

    Python之FTP多线程下载文件之分块多线程文件合并 欢迎大家阅读Python之FTP多线程下载系列之二:Python之FTP多线程下载文件之分块多线程文件合并,本系列的第一篇:Python之FTP ...

  6. MVP社区巡讲

    MVP社区巡讲照片集 今天MVP社区巡讲在北京利星行微软大厦连同SQL PASS社区合办了一次线下活动,这次互动汇集了在北京大多数的微软MVP,他们都是微软认可的有着各微软产品和技术特长的技术专家,无 ...

  7. ExtJS初接触 —— 了解 Ext Core

    ExtJS初接触 —— 了解 Ext Core Ext Core是一款和jQuery媲美的轻型JS库,基于MIT许可.对于Dom的操作,我个人还是比较喜欢用jQuery.当然如果项目中用的是ExtJS ...

  8. C++中内存泄漏的检测方法介绍

    C++中内存泄漏的检测方法介绍 首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复. 最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck, ...

  9. Web API 的安全性

    Web API 的安全性 ASP.NET Web API 可非常方便地创建基于 HTTP 的 Services,这些服务可以非常方便地被几乎任何形式的平台和客户端(如浏览器.Windows客户端.An ...

  10. MapXtreme 随笔记录1

    最近在用MapXtreme做项目,随笔记录备忘. 声明:PubMapPara 静态类,后缀为静态类成员变量 1.加载地图 /// <summary> /// 地图工作空间文件路径 /// ...