原文地址/lilystruggle/article/details/44828613
需求:实现头像上传(包含图片本地上传和调用摄像头来拍照上传),上传的头像要经过处理,比如放大,缩小,固定区域裁剪功能;
流程:图片裁剪之前要先压缩,因为是两个页面之间进行的,所以要先通过php来存储经过压缩处理的图片的src,
之后传上裁剪页面的固定的图片位置,在对这张进行相关的裁剪操作;
时间:一个星期,浏览器兼容等等很多问题导致截图位置总是有偏差,放大就更明显了
1、调用本地文件和摄像头:
- 之前的想法和写法 调用本地的文件使用file文件流
html:
<html><h1>选择图片:<input type="file" οnchange="">
<input type="button" value="保存图片" /></h1></html>
js:
var input_browseFile = ("browseFile");
input_browseFile.addEventListener("change", function () {
//通过 取到 FileList ,这里只有一个
previewInImage([0]);
}, false);
function previewInImage (file) {
//通过可以取得图片大小
var reader = new FileReader();
= function( evt ){
$('img').src = ;
}
Options_image.imgData= (file);
}
调用手机摄像头的方法:通过调用摄像头之后,通过video标签获取画面,然后放到canvas里面
html: `<video autoplay=""></video>`
JS
<script>
var video_element = ('video');
if () { // opera should use now, chrome use webkitGetUserMedia
('video',success, error);
}
function success(stream) {
video_element.src =stream;
}
</script>
调用摄像头也存在很多的兼容问题,很多浏览器不支持这个人方法
②之后的想法和写法
后来用手机开始测试的时候发现,input标签可以直接调用本地文件和照相功能,唉,绕了好大个圈子,又回来了;
html:
<input type="file" οnchange="" style="display:none">
这一句话就可以调用手机的本地文件了,当然包含了相机
2、本地压缩图片上传
需求:首页点击头像,选择本地文件或者拍照,确定后掉转到裁剪页面,同时出现你选择的图片,因为是两个页面之间的切换,图片经过编码后不知道是问题太大的原因还是什么不能放到cookie里面,所以通过php来帮忙存储了一下,前端实现压缩过程如下:
获取图片:
这里调用了一个插件,很好用,解决了很多兼容的问题,
之后就很好做了:注:这是别人的,稍微改了一部分;
$. = function (obj) {
var ViewHeight;
var ViewWidth;
var pLeft;
var pTop;
var base64;
var scale
('change', function () {
var file = [0];
var URL = URL || webkitURL;
var blob = (file);
// 执行前函数
if($.isFunction()) { (this, blob, file) };
_create(blob, file);
= ''; // 清空临时数据
});
/**
* 生成base64
* @param blob 通过file获得的二进制
*/
function _create(blob) {
var img = new Image();
= blob;
= function () {
var that = this;
//生成比例
var w = ,
h = ,
scale = (w/$(window).width(),h/$(window).height());
if(scale>1){
ViewWidth=parseInt((w/scale));
ViewHeight=parseInt((h/scale));
}
else{
ViewWidth=w;
ViewHeight=h;
}
//生成canvas
var canvas = ('canvas');
var ctx = ('2d');
= ViewWidth;
= ViewHeight;
(that,0,0,ViewWidth,ViewHeight);
/**
* 生成base64
* 兼容修复移动设备需要引入
*/
base64 = ('image/jpeg');
// 修复IOS
if( (/iphone/i) ) {
var mpImg = new MegaPixImage(img);
(canvas, { maxWidth: ViewWidth, maxHeight: ViewHeight, orientation: 6});
base64 = ('image/jpeg');
}
// 修复android
if( (/Android/i) ) {
var encoder = new JPEGEncoder();
base64 = ((0,0,ViewWidth,ViewHeight), * 100 || 80 );
}
// 生成结果
var result = {
base64 : base64,
// clearBase64: ( (',') + 1 )
};
// 执行后函数
(result);
};
}
};
页面直接这样引用上面的方法:
$('#browseFile').localResizeIMG({
//width: 500,
// quality: 0.8,
success: function (result) {
var img = new Image();
= result.base64;
$('form').find('input').val();
$('form').submit();
}
});