直接上代码

directive.js

app.directive('fileUploadersm', function () {
return {
restrict: 'E',
transclude: true,
template: '<input type="file" accept="images/*" id="files" >' + '<div class="containertsm"></div><button ng-click="upload()" class="btn btn-danger">确定上传</button><br/>' + '<ul><li ng-repeat="file in files"> - </li></ul>',
controller: function ($scope, $fileUpload) {
$scope.notReady = true;
$scope.addfood = function () {
$fileUpload.upload($scope.files);
};
},
link: function ($scope, $element) {
////////////
var tmp = $('<div class="resizer">' + '<div class="inner">' + '<img class="imgs">' + '<div class="frames"></div>' + '</div>' + '<button class="ok">✓</button>' + '</div>');
$.imageResizer = function () {
if (Uint8Array && HTMLCanvasElement && atob && Blob) {
}
else {
return false;
}
var resizer = tmp.clone();
resizer.image = resizer.find('img')[0];
resizer.frames = resizer.find('.frames');
resizer.okButton = resizer.find('button.ok');
resizer.frames.offset = {
top: 0,
left: 0
};
resizer.okButton.click(function () {
resizer.clipImage();
});
resizer.clipImage = function () {
var nh = this.image.naturalHeight, nw = this.image.naturalWidth, size = nw > nh ? nh : nw;
size = size > 150 ? 150 : size;
var canvas = $('<canvas class="tcanvas" width="' + size + '" height="' + size + '"></canvas>')[0],
ctx = canvas.getContext('2d'),
scale = nw / this.offset.width,
x = this.frames.offset.left * scale,
y = this.frames.offset.top * scale,
w = this.frames.offset.size * scale,
h = this.frames.offset.size * scale;
ctx.drawImage(this.image, x, y, w, h, 0, 0, size, size); var src = canvas.toDataURL();
this.canvas = canvas;
this.append(canvas);
this.addClass('uploading');
this.removeClass('have-img');
src = src.split(',')[1];
if (!src)
return this.doneCallback(null);
src = window.atob(src);
var ia = new Uint8Array(src.length);
for (var i = 0; i < src.length; i++) {
ia[i] = src.charCodeAt(i);
}
;
this.doneCallback(new Blob([ia], { type: "image/png" }));
Id = new Blob([ia], { type: "image/png" });//这里Id 存放的就是裁剪之后的相片你可以自定义全局参数
};
resizer.resize = function (file, done) {
this.reset();
this.doneCallback = done;
this.setFrameSize(0);
this.frames.css({
top: 0,
left: 0
});
var reader = new FileReader();
reader.onload = function () {
resizer.image.src = reader.result;
reader = null;
resizer.addClass('have-img');
resizer.setFrames();
};
reader.readAsDataURL(file);
};
resizer.reset = function () {
this.image.src = '';
this.removeClass('have-img');
this.removeClass('uploading');
this.find('canvas').detach();
};
resizer.setFrameSize = function (size) {
this.frames.offset.size = size;
return this.frames.css({
width: size + 'px',
height: size + 'px'
});
};
resizer.getDefaultSize = function () {
var width = this.find(".inner").width(), height = this.find(".inner").height();
this.offset = {
width: width,
height: height
};
console.log(this.offset);
return width > height ? height : width;
};
resizer.moveFrames = function (offset) {
var x = offset.x, y = offset.y, top = this.frames.offset.top, left = this.frames.offset.left, size = this.frames.offset.size, width = this.offset.width, height = this.offset.height;
if (x + size + left > width) {
x = width - size;
}
else {
x = x + left;
}
;
if (y + size + top > height) {
y = height - size;
}
else {
y = y + top;
}
;
x = x < 0 ? 0 : x;
y = y < 0 ? 0 : y;
this.frames.css({
top: y + 'px',
left: x + 'px'
});
this.frames.offset.top = y;
this.frames.offset.left = x;
};
(function () {
var time;
function setFrames() {
var size = resizer.getDefaultSize();
resizer.setFrameSize(size);
}
;
window.onresize = function () {
clearTimeout(time);
time = setTimeout(function () {
setFrames();
}, 1000);
};
resizer.setFrames = setFrames;
})();
(function () {
var lastPoint = null;
function getOffset(event) {
event = event.originalEvent;
var x, y;
if (event.touches) {
var touch = event.touches[0];
x = touch.clientX;
y = touch.clientY;
}
else {
x = event.clientX;
y = event.clientY;
}
if (!lastPoint) {
lastPoint = {
x: x,
y: y
};
}
;
var offset = {
x: x - lastPoint.x,
y: y - lastPoint.y
};
lastPoint = {
x: x,
y: y
};
return offset;
}
;
resizer.frames.on('touchstart mousedown', function (event) {
getOffset(event);
});
resizer.frames.on('touchmove mousemove', function (event) {
if (!lastPoint)
return;
var offset = getOffset(event);
resizer.moveFrames(offset);
});
resizer.frames.on('touchend mouseup', function (event) {
lastPoint = null;
});
})();
return resizer;
};
var resizer = $.imageResizer(), resizedImage;
if (!resizer) {
resizer = $("<p>Your browser doesn't support these feature:</p><ul><li>canvas</li><li>Blob</li><li>Uint8Array</li><li>FormData</li><li>atob</li></ul>");
}
;
$('.containertsm').append(resizer);
///////////////////
var fileInput = $element.find('input[type="file"]');
fileInput.bind('change', function (e) {
var file = this.files[0];
resizer.resize(file, function (file) {
resizedImage = file;
});
$scope.notReady = e.target.files.length == 0;
$scope.files = [];
for (i in e.target.files) {
//Only push if the type is object for some stupid-ass reason browsers like to include functions and other junk
if (typeof e.target.files[i] == 'object')
$scope.files.push(e.target.files[i]);
}
});
// var file=this.files[0];
// resizer.resize(file,function(file){
// resizedImage=file;
// });
}
};
});

  部分内容 请参照 html5 实现本地上传裁剪 http://www.webrube.com/jquery-html5-web_rube/4300

html 代码

<div class="col-sm-6">
<div>
<file-uploader></file-uploader>
</div>
</div>

  

AngularJs + html 5 实现 裁剪上传的更多相关文章

  1. 第三百九十节,Django+Xadmin打造上线标准的在线教育平台—Django+cropper插件头像裁剪上传

    第三百九十节,Django+Xadmin打造上线标准的在线教育平台—Django+cropper插件头像裁剪上传 实现原理 前台用cropper插件,将用户上传头像时裁剪图片的坐标和图片,传到逻辑处理 ...

  2. springMVC 头像裁剪上传并等比压

    第一次写头像裁剪上传,原本想着直接本地预览裁剪再上传,可是时间有限,jquery.jcrop貌似并没有对 假设是ie下图片预览效果是滤镜做的  做出对应处理,也没有时间去改;仅仅好将就一下先把图片上传 ...

  3. PHP+jQuery.photoClip.js支持手势的图片裁剪上传实例

    PHP+jQuery.photoClip.js支持手势的图片裁剪上传实例,在手机上双指捏合为缩放,双指旋转可根据旋转方向每次旋转90度,在电脑上鼠标滚轮为缩放,双击则顺时针旋转90度. 下面让我们来看 ...

  4. vue中使用cropperjs进行图片裁剪上传

    下面代码直接就可以复制使用了,但是需要在本地下个cropperjs,下载命令:npm install cropperjs --save-dev <template> <div id= ...

  5. 微信小程序实现图片裁剪上传(wepy)

    参考https://github.com/we-plugin/we-cropper,在wepy中实现,参考的具体例子是we-cropper/example/cutInside/ 项目上传图片时2:3的 ...

  6. jfinal头像裁剪上传服务器

    前端页面完整代码,复制可用,记得导入库文件 <!DOCTYPE html> <html lang="en"> <head> <title& ...

  7. mui+vue+photoclip做APP头像裁剪上传

    做APP由于项目需要,需要做用户头像上传的功能,头像上传包括拍照和相册选择图片进行上传,这里使用的技术是mui封装的plus,在进行图片裁剪的时候,使用的是photoclip来进行裁剪,由于个人在使用 ...

  8. angularjs结合plupload实现文件上传

    转载注明:(罗志强的博客) angularjs的指令directive非常好使,可以很方便的结合各种插件,实现很强大的功能. 今天用到了plupload,就拿它举例吧. 正常的plupload用法应该 ...

  9. 图片裁剪上传插件——jquery.photoClip.js

    想要裁剪图片上传: 需要依赖的的插件为: [jquery.photoClip.js] 插件[iscroll-zoom.js] 插件[hammer.js] 插件 [lrz.all.bundle.js] ...

随机推荐

  1. eclipse中添加svn插件

    在eclipse中使用svn查看能非常方便的对代码进行查看和更新提交操作,能及时知道代码的更新状态. 在eclipse中如果要使用svn,只能使用svn插件的方式进行. 插件地址:http://sub ...

  2. 如何使用Python的logging模块

    几个学习连接: Python官方链接: https://docs.python.org/3.4/library/logging.html?highlight=logging 翻译(不过是2.3版本的) ...

  3. Linux Shell系列教程之(十)Shell for循环

    本文是Linux Shell系列教程的第(十)篇,更多Linux Shell教程请看:Linux Shell系列教程 基本任何语言都有自己的循环语句,Shell当然也不例外,今天就为大家介绍下Shel ...

  4. 刷题总结——Bob's Race(hdu4123 树形dp+st表)

    题目: Bob wants to hold a race to encourage people to do sports. He has got trouble in choosing the ro ...

  5. Miracast HDCP 等知识

    Miracast 通讯架构中关于视频数据处理流程的部分.整个视频数据处理及传输的流程,大致上分为几个阶段,一开始将撷取到系统的画面及声音进行压缩,而压缩后的影音数据再转为基本封包串流(Packetiz ...

  6. java面试题之wait(),notify()和suspend(),resume()之间的区别

    wait()方法和notify()方法的区别: 这两个方法都是属于Object类中的,也是配套使用的,当调用这两个方法阻塞时要释放占用的锁,而锁是任何对象都具有的,调用任意对象的wait()方法导致线 ...

  7. 需要打印真实尺寸大小等需求的,css的单位可以使用mm等做单位

    今天甲方那边改需求了,要求打印出来的尺寸是85mm/55mm的,开始还一直在网上找px和mm的相关换算,结果去w3c看了,竟然还有mm单位的, 在这里做个笔记

  8. luogu 3708 koishi的数学题 递推 线性筛

    题目链接 题意 输入一个整数\(n\)\((n\leq 1e6)\),设\(f(x)=\sum_{i=1}^n x\mod i\),你需要输出\(f(1),f(2)...,f(n)\). 输入输出格式 ...

  9. IOS-<input>表单元素只能读,设置readonly时光标仍然可见的解决办

    在HTML中,如果把一个<input>的readonly属性设置为"readonly",表示这个表单元素不能编辑. 但是,鼠标点击之后,这个表单元素还是有光标存在的. ...

  10. R语言实战读书笔记(八)回归

    简单线性:用一个量化验的解释变量预测一个量化的响应变量 多项式:用一个量化的解决变量预测一个量化的响应变量,模型的关系是n阶多项式 多元线性:用两个或多个量化的解释变量预测一个量化的响应变量 多变量: ...