AngularJs + html 5 实现 裁剪上传
直接上代码
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 实现 裁剪上传的更多相关文章
- 第三百九十节,Django+Xadmin打造上线标准的在线教育平台—Django+cropper插件头像裁剪上传
第三百九十节,Django+Xadmin打造上线标准的在线教育平台—Django+cropper插件头像裁剪上传 实现原理 前台用cropper插件,将用户上传头像时裁剪图片的坐标和图片,传到逻辑处理 ...
- springMVC 头像裁剪上传并等比压
第一次写头像裁剪上传,原本想着直接本地预览裁剪再上传,可是时间有限,jquery.jcrop貌似并没有对 假设是ie下图片预览效果是滤镜做的 做出对应处理,也没有时间去改;仅仅好将就一下先把图片上传 ...
- PHP+jQuery.photoClip.js支持手势的图片裁剪上传实例
PHP+jQuery.photoClip.js支持手势的图片裁剪上传实例,在手机上双指捏合为缩放,双指旋转可根据旋转方向每次旋转90度,在电脑上鼠标滚轮为缩放,双击则顺时针旋转90度. 下面让我们来看 ...
- vue中使用cropperjs进行图片裁剪上传
下面代码直接就可以复制使用了,但是需要在本地下个cropperjs,下载命令:npm install cropperjs --save-dev <template> <div id= ...
- 微信小程序实现图片裁剪上传(wepy)
参考https://github.com/we-plugin/we-cropper,在wepy中实现,参考的具体例子是we-cropper/example/cutInside/ 项目上传图片时2:3的 ...
- jfinal头像裁剪上传服务器
前端页面完整代码,复制可用,记得导入库文件 <!DOCTYPE html> <html lang="en"> <head> <title& ...
- mui+vue+photoclip做APP头像裁剪上传
做APP由于项目需要,需要做用户头像上传的功能,头像上传包括拍照和相册选择图片进行上传,这里使用的技术是mui封装的plus,在进行图片裁剪的时候,使用的是photoclip来进行裁剪,由于个人在使用 ...
- angularjs结合plupload实现文件上传
转载注明:(罗志强的博客) angularjs的指令directive非常好使,可以很方便的结合各种插件,实现很强大的功能. 今天用到了plupload,就拿它举例吧. 正常的plupload用法应该 ...
- 图片裁剪上传插件——jquery.photoClip.js
想要裁剪图片上传: 需要依赖的的插件为: [jquery.photoClip.js] 插件[iscroll-zoom.js] 插件[hammer.js] 插件 [lrz.all.bundle.js] ...
随机推荐
- HDU2013 蟠桃记【递推】
Problem Description 喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题!什么问题?他研究的问题是蟠桃一共有多少 ...
- wampSever的mysql操作
单击wampserver图标,选择mysql console 输入密码 123qwe,root用户默认密码为空 mysql客户端管理工具使用wampserver自带的phpmyadmin
- 第一个 XMLHttpRequest 例子(API)
[API] https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest [替代方案] 如果不想自己敲代码,可以直接访问以下URL测试 ...
- P4513 小白逛公园 (线段树)
题目链接 Solution 线段树是一门比较刁钻的手艺... 此题我们需要维护 \(4\) 个变量: \(amx\) 代表当前节点的最大值. \(lmx\) 代表当前节点以左端点为起点的区间最大值. ...
- [SCOI2016] 背单词 (Trie 树,贪心)
题目链接 大致题意 给你 \(n\) 个字符串, 要求你给出最小的代价. 对于每个字符串: 1.如果它的后缀在它之后,那么代价为 \(n^2\). 2.如果一个字符串没有后缀,那么代价为 \(x\), ...
- 你如果知道这些css常用命名,绝对事半功倍!--摘抄
对于布局,即用.g-作为前缀,通常有以下推荐的写法 对于模块,即.m-作为前缀.元件,.u-作为前缀,通常有下面推荐的写法. 对于功能,即以.f-为前缀,通常推荐如下: 对于颜色,即以.s-为前缀,通 ...
- ubuntu16.04安装ibus中文输入法
按照网上给的安装方法,没成功,在切换ibus的时候总是报错,记录下解决办法. 安装语言包 System Settings–>Language Support–>Install/Remove ...
- python--导入就方便实现你需要的功能(模块)
模块让你能够有逻辑地组织你的Python代码段. 把相关的代码分配到一个 模块里能让你的代码更好用,更易懂. 模块也是Python对象,具有随机的名字属性用来绑定或引用. 简单地说,模块就是一个保存了 ...
- Xamarin XAML语言教程使用Visual Studio创建XAML
Xamarin XAML语言教程使用Visual Studio创建XAML Xamarin.Forms允许开发人员通过XAML语法对程序的所有用户界面元素进行详细的定制,如文本.按钮.图像和列表框等. ...
- 网络数据注入工具HexInject
网络数据注入工具HexInject 对于Kali Linux提供的工具HexInject来说,数据注入才是其最重要的功能.它可以直接向网络注入渗透人员构造的数据包,也可以篡改网络传输的数据.为了避 ...