基于HTML5+JS实现本地图片裁剪并上传功能

2019-01-07

编程之家

https://www.jb51.cc

编程之家收集整理的这篇文章主要介绍了基于HTML5+JS实现本地图片裁剪并上传功能,编程之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

最近做了一个项目,这个项目中需要实现的一个功能是:用户自定义头像(用户在本地选择一张图片,在本地将图片裁剪成满足系统要求尺寸的大小)。这个功能的需求是:头像最初剪切为一个正方形。如果选择的图片小于规定的头像要求尺寸,那么这整张图片都会作为头像。如果大于规定的尺寸,那么用户可以选择要裁剪的区域。用户点击确定按钮,就将裁剪得到的图片数据发送到服务器,在后端将图片数据保存成一个文件。

要完成上述功能,涉及到的知识有:ajax,canvas和html5中的files接口。我将实现这个功能的代码封装到了4个模块中,分别是ajax.js,preview.js,shear.js和customerImg.js。

ajax.js:用于发送ajax请求。

preview.js:用于图片预览

shear.js:用于裁剪图片

customer.js:自定义头像。在这个模块中药引入ajax.js,preview.js和shear.js

我使用webpack进行打包。我还使用了jquery和jquery-ui。

我从这个项目中抽离出了这个功能。下面是这个功能的详细代码。

图片

预览

2.CSS代码

有了css和html的运行结果如下:

3.js代码

customerImg.js

自定义头像

* @constructor

*/

function CustomerImg() {

this.isSupport = null;

this.previewBox = null;

this.warp = null;

}

/**

* 入口

* @param warp 操作区域 jquery节点

*/

CustomerImg.prototype.start = function (warp) {

var info,me,warpBox;

me = this;

this.isSupport = this.__isSupport();

if(!this.isSupport) {

info = $('

你的浏览器不支持自定义头像,可更换高版本的浏览器自定义头像');

$('body').html(info);

return this;

}

//判断操作区域示范存在

if(warp && warp.length > 0){

this.warp = warp;

}else{

return this;

}

//预览

preview.start(warp,shear.start.bind(shear,warp));

this.previewBox = warp.find('#preview');

//确定

warp

.find('#submit')

.unbind('click')

.on('click',me.__submit.bind(me));

};

/**

* 提交

* @private

*/

CustomerImg.prototype.__submit = function () {

var cvsMove,data,fd;

cvsMove = this.previewBox.find('#cvsMove');

data = cvsMove[0].toDataURL('image/jpg',1);

fd = {

'customerImg':data

};

ajax.upload(fd);

};

/**

* 判断是否支持自定义头像

* @returns {boolean}

* @private

*/

CustomerImg.prototype.__isSupport = function () {

var canvas,context;

canvas= document.createElement('canvas');

if(typeof FileReader === 'function'&& canvas.getContext && canvas.toDataURL){

return true;

}else{

return false;

}

};

var customerImg = new CustomerImg();

module.exports = customerImg;

preview.js

BoxElem = null;

this.callback = null;

this.type = null;

}

/**

* 入口

* @param BoxElem 操作区域

* @param callback 预览结束的回调函数

*/

Preview.prototype.start = function (BoxElem,callback) {

var chooseFile,me;

me = this;

if(! BoxElem || BoxElem.length <= 0) return this;

this.BoxElem = BoxElem;

if(typeof callback === 'function'){

this.callback = callback;

}

if(this.__isSupport()){

chooseFile = BoxElem.find('input[type="file"]');

chooseFile

.on('change',me.fileChange.bind(me))

}

};

/**

* 选择图片的事件处理程序

* @param event

*/

Preview.prototype.fileChange = function (event) {

var target,reader,file,type;

target = event.target;

me = this;

file = target.files[0];

type = file.type;

this.type = type;

if(type !== 'image/png' && type !== 'image/jpg' && type !== 'image/jpeg'){

alert('文件格式不正确');

return this;

}

reader = new FileReader();

if(file){

reader.readAsDataURL(file);

}

reader.onload = function () {

me.show(reader);

}

};

/**

* 显示从本地选择的图片

* @param reader fileReader对象

*/

Preview.prototype.show = function (reader) {

var preView,img,me;

preView = this.BoxElem.find('#preview');

img = preView.find('#preImg');

me = this;

if(img.length <= 0){

preView.append($('

图片加载完成后再执行回调

img.on('load',function () {

if(me.callback){

me.callback(me.type);

}

});

img.attr('src',reader.result);

};

/**

* 是否支持预览

* @returns {boolean}

* @private

*/

Preview.prototype.__isSupport = function () {

return typeof FileReader === 'function';

};

var preview = new Preview();

module.exports = preview;

shear.js

Box = null;

this.cvsMove = null;

this.maxW = 200;

this.maxH = 200;

this.thum = null;

this.fileType = 'image/jpeg';

}

/**

* 入口

* @param previewBox 预览元素的父元素

* @param fileType 裁剪的图片的类型 如:'image/jpg'

* @returns {Shear}

*/

Shear.prototype.start = function (previewBox,fileType) {

if(!arguments.length) return this;

var me = this;

this.previewBox = previewBox;

if(fileType){

this.fileType = fileType;

}

this.thum = this.previewBox.find('#thum');

this.cvsMove = this.previewBox.find('#cvsMove');

this.showCanvas();

return this;

};

/**

显示出canvas

/

Shear.prototype.showCanvas = function () {

var preImg,h,w,cvsH,cvsW,rateH,rateW,naturalH,naturalW,preview;

me = this;

preImg = this.previewBox.find('#preImg');

preview = this.previewBox.find('#preview');

naturalH = preImg[0].naturalHeight;

naturalW = preImg[0].naturalWidth;

//将canvas显示出来

this.cvsMove.show();

//将canvas置于(0,0)

this.cvsMove

.css({

"left":'0','top':'0'

});

h = preImg.height();

w = preImg.width();

//规定裁剪出的图片尺寸为200px200px

//要保证裁剪的图片不变形

if(h < this.maxH || w < this.maxW){

this.cvsMove[0].width = cvsW = Math.min(h,w);

this.cvsMove[0].height = cvsH = Math.min(h,w);

}else{

this.cvsMove[0].width= cvsW = this.maxW;

this.cvsMove[0].height= cvsH = this.maxH;

}

rateH = h/naturalH;

rateW = w/naturalW;

this.__drawImg(preImg,cvsW/rateW,cvsH/rateH,cvsH);

//使用jquery-ui中的功能使canvas可以移动

this.cvsMove.draggable(

{

containment: "parent",drag:function (event,ui) {

var left,top;

left = ui.position.left;

top = ui.position.top;

//canvas每次移动都有从新绘制图案

me.__drawImg(preImg,left/rateW,top/rateH,cvsH);

}

}

)

};

/**

在canvas上显示图片

@param myImg 要显示的图片节点

@param sx 图片的起点在原图片上的x坐标

@param sy 图片的起点在原图上的y坐标

@param sW 在原图上的宽度

@param sH 在原图上的高度

@param dx 起点在canvas上的x坐标

@param dy 起点在canvas上的y坐标

@param dW 在canvas上的宽度

@param dH 在canvas上的高度

@private

*/

Shear.prototype.__drawImg = function (myImg,sx,sy,sW,sH,dx,dy,dW,dH) {

var cxt,thum,me;

me = this;

cxt = this.cvsMove[0].getContext('2d');

cxt.drawImage(myImg[0],dH);

thum = this.thum;

//将canvas上的图案显示到右侧

thum

.attr('src',this.cvsMove[0].toDataURL(me.fileType,1))

.width(this.maxW)

.height(this.maxH)

};

var shear = new Shear();

module.exports = shear;

ajax.js

}

/**

上传图片数据

*/

Ajax.prototype.upload = function (data) {

$.ajax({

type:'POST',data:data,dataType:'json',url:'/test/PHP/upload.PHP',success:function (result) {

if(result.status){

location.reload();

}else{

alert(result.msg);

}

}

});

};

var ajax = new Ajax();

module.exports = ajax;

最后在另一个文件中,调用customerImg对象的start方法

webpack的配置文件如下:

PHP;">

if(!empty($_POST) && isset($_POST['customerImg'])){

$img = $_POST['customerImg'];

$imgdata = explode(',',$img);

$uniName = md5 ( uniqid ( microtime ( true ),true ) );

$a = file_put_contents('./../uploads/'.$uniName.'.jpg',base64_decode($imgdata[1]));

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

小编个人微信号 jb51ccc

喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

html上传图片裁剪,基于HTML5+JS实现本地图片裁剪并上传功能相关推荐

  1. 摄像头网页服务器,js调用本地摄像头拍照并上传到web服务器

    [实例简介] js调用本地摄像头拍照并上传到web服务器.后台使用java实现图片的接收和存储,上传的图片默认保存到项目下的images文件夹中. [实例截图] [核心代码] MyCamera └── ...

  2. Node.js新手教程——怎样实现文件上传功能

    作者:zhanhailiang 日期:2014-11-16 本文将介绍怎样使用Node.js实现文件上传功能. 1. 初始化项目信息:npm init [root@~/wade/nodejs/node ...

  3. 基于node+koa+miniprogram-ci实现小程序批量上传功能

    基于node+koa+miniprogram-ci实现小程序自动化批量上传功能 在实际开发中,有这样的业务,一套代码需要部署多个小程序,上传代码时候绝对上传到手软,虽然可以接入微信服务商,但是服务商有 ...

  4. html5调用手机摄像头,实现拍照上传功能

    http://www.glve.net/html5-calls-cell-phone-cameras-to-achieve-photo-upload-feature.html 今天做手机网站,想实现手 ...

  5. 类似新浪微博和google图片的HTML5实现图片拖拽上传功能

    2019独角兽企业重金招聘Python工程师标准>>> 来源: http://www.lovesunlife.com/?p=315 这篇文章对google图片为蓝本就拖拽上传功能分析 ...

  6. js拖拽图片到浏览器上传

    拖拽的事件有很多,这个懂的都懂不懂的就- <!doctype html> <html> <head> <meta charset="utf-8&qu ...

  7. HTML5 文件域+FileReader 读取文件并上传到服务器(三)

    一.读取文件为blob并上传到服务器 HTML <div class="container"><!--读取要上传的文件--><input type=& ...

  8. HTML5 实现本地图片裁剪

    HTML5 实现本地图片裁剪 文章目录 HTML5 实现本地图片裁剪 1.知识点 1.HTML 结构与 CSS 样式 2.初始化 3 实现 handleFiles,获取文件,读取文件并生成 url 4 ...

  9. vue本地上传并预览php,vue.js 实现图片本地预览 裁剪 压缩 上传功能

    以下代码涉及 Vue 2.0 及 ES6 语法. 目标 纯 javascrpit 实现,兼容ie9及以上浏览器,在本地做好文件格式.长宽.大小的检测,减少浏览器交互. 现实是残酷的,为了兼容Ie9 还 ...

最新文章

  1. win7网络中能看到计算机但无法连接,win7局域网内可以看到对方计算机但无法连接怎么办...
  2. iOS 11开发教程(十三)iOS11应用编辑界面添加视图
  3. spring_Spring MVC控制器的单元测试:配置
  4. MATLAB从入门到精通-缺失值和异常值的处理应用案例
  5. html5.js让IE(包括IE6)支持HTML5元素方法
  6. PAT甲级 -- 1041 Be Unique (20 分)
  7. __attribute__((always_inline))
  8. 稳态可压Navier-Stokes方程组在修正Dirichlet边界下的解的存在性
  9. SSL introduce itself from baidu
  10. ExecuteNonQuery()的返回值
  11. limitBy过滤器是配合数组使用的,限制数组元素的个数,话不多说,来个小例子。...
  12. Sublime Text快捷键
  13. Git 新建分支和Commit Message 规范和最佳实践
  14. php is_subclass_of,PHP中的is_subclass_of()函数
  15. 2021-02-23
  16. cmd看excel有多少个子表_excel表格拆分成多个表格方法工具
  17. python 语言与numpy库
  18. 在中国人群中感染率最高的高危型HPV病毒是HPV16、HPV52和HPV58
  19. 加速代理游戏,让指定进程走代理网络,驱动级SOCKS5代理使用方法。
  20. 《精进:如何成为一个很厉害的人》读书笔记

热门文章

  1. APOLLO安装教程
  2. 2022最新玖逸云黑PHP系统程序源码+全开源无加密
  3. 基于LightGBM的分类预测
  4. 中南大学计算机学院陈学工,中南大学
  5. android 仿全民k歌 线谱乐谱音高图
  6. 交通银行服务器获取安装文件失败,交行APP被信通院点名 超范围获取权限用户不满...
  7. 基于51单片机的智能加湿器设计。 有仿真,程序,原理图,原文
  8. MSP432P401R+TOFLuna激光雷达测距+OLED显示
  9. bcd转ascii码 流程图_BCD码转换成二进制和ASCII码
  10. RabbitMQ集群部署