1.html部分

使用一个input[type="file"]进行图片上传;

canvas进行图片的裁剪展示

<div>
<input type="file" id="imgFile">
</div>
<div id="demoBox" style="width: 300px;height: 300px;position: absolute;left: 300px;top: 0;overflow:hidden;border: 1px solid #ccc">
<img id="demoImg" alt="">
<div style="width: 150px;height: 150px;border: 1px solid #4fb8e3;background:rgba(255,255,255,.5);position: absolute;left: 0;top: 0;z-index: 1000;cursor:move" id="chooseBox"></div>
</div>
<div style="position: absolute;left: 700px;top: 0">
<canvas id="myCan" width="150" height="150"></canvas>
<button id="cut">裁剪文件</button>
<button id="btn">后台返回获取裁剪后的文件</button>
<img id="returnImg" alt="">
</div>

2.js部分

a.使用file文件的files属性,获取上传图片的基本属性;

b. new FileReader() 对象,使用其属性e.target.result将图片地址转为base64,赋给img标签上;

c. 创建一个裁剪选区,用以选择需要裁剪的部位,同事使用mousedown,mousemove,mouseup事件进行选框的拖拽;

d. 使用canvas中的drawImage()方法进行图片的裁剪,展示到canvass画布上;

e.用户在使用裁剪时候,可多次裁剪,因此需要每次裁剪之后利用clearRect()方法,进行画布的清除

// 图片裁剪

    window.onload = function () {

        // 上传图片
var canvas = document.getElementById('myCan');
var imgFile = $('#imgFile');
var demoImg = $('#demoImg');
var ctx = canvas.getContext('2d');
imgFile.change(function () {
var file = imgFile[0].files[0];
console.log(file);
var reader = new FileReader();
reader.onload = function (e) {
console.log(e);
demoImg.attr('src', e.target.result);
};
reader.readAsDataURL(file);
}); // 位移选裁框
var dragDiv = $('#chooseBox');
dragDiv.mousedown(function (e) {
var oleft = $(this).position().left;
var otop = $(this).position().top;
var X = e.pageX - oleft;
var Y = e.pageY - otop;
$(document).mousemove(function (e) {
var left = e.pageX - X;
var top = e.pageY - Y;
if (left <= 0) {
left = 0;
}
else if (left >= ($('#demoBox').outerWidth(true) - dragDiv.outerWidth(true))) {
left = ($('#demoBox').outerWidth(true) - dragDiv.outerWidth(true));
} if (top <= 0) {
top = 0;
}
else if (top >= ($('#demoBox').outerHeight(true) - dragDiv.outerHeight(true))) {
top = ($('#demoBox').outerHeight(true) - dragDiv.outerHeight(true));
} dragDiv.css({
left: left,
top: top
}); });
});
$(document).mouseup(function () {
$(this).unbind('mousemove');
}); // 裁剪
function cut() {
var sx = dragDiv.position().left;
var sy = dragDiv.position().top;
var img = document.getElementById('demoImg');
ctx.drawImage(img, sx, sy, 150, 150, 0, 0, 150, 150);
} $('#cut').click(function () {
ctx.clearRect(0, 0, 150, 150);
cut();
}); };

使用canvas进行图片裁剪简单功能的更多相关文章

  1. Java实现图片裁剪预览功能

    在项目中.我们须要做些类似头像上传,图片裁剪的功能,ok看以下文章! 须要插件:jQuery Jcrop 后端代码: package org.csg.upload; import java.awt.R ...

  2. 好用的开源库(二)——uCrop 图片裁剪

    最近想要实现图片裁剪的功能,在Github上找到了这个uCrop,star的人挺多的,便是决定入坑,结果长达一个小时的看资料+摸索,终于是在项目中实现了图片裁剪的功能,今天便是来介绍一下uCrop的使 ...

  3. jQuery 图片裁剪插件 Jcrop

    Jcrop是一个jQuery图片裁剪插件,它能为你的WEB应用程序快速简单地提供图片裁剪的功能.特点如下: 对所有图片均unobtrusively(无侵入的,保持DOM简洁) 支持宽高比例锁定 支持 ...

  4. Android图片裁剪之自由裁剪

    我的博客http://blog.csdn.net/dawn_moon 客户的需求都是非常怪的.我有时候在给客户做项目的时候就想骂客户是sb.可是请你相信我,等你有需求,自己变成客户的时候,给你做项目的 ...

  5. (H5)canvas实现裁剪图片和马赛克功能,以及又拍云上传图片

    1.核心功能 此组件功能包含: 图片裁剪(裁剪框拖动,裁剪框改变大小): 图片马赛克(绘制马赛克,清除马赛克): 图片预览.图片还原(返回原图.返回处理图): 图片上传(获取签名.上传图片). 2.核 ...

  6. 从web图片裁剪出发:了解H5中的canvas

    本篇内容不针对canvas文档对每个api进行逐个的详解! 本篇内容不针对canvas文档对每个api进行逐个的详解! 本篇内容不针对canvas文档对每个api进行逐个的详解! 重说三,好了,现在进 ...

  7. 移动端 H5图片裁剪插件,内置简单手势操作

    前面曾经写过一篇<H5图片裁剪升级版>,但里面需要借助第三方手势库,这次就不需要使用手势库,全部封装在代码中. 下图是裁剪的展示,下面就做了拖放和裁剪,没有做缩放,在插件中需要用到大量的计 ...

  8. iOS实现图片裁剪功能,基于TKImageView完善与讲解

    1.功能需求:需要实现图片区域裁剪功能. 2.效果图:     3.实现原理:本来想自己实现的,刚好看到一个比较好的库:TKImageView,下载好研究了下,发现基本都能满足我的需求,而且封装的也比 ...

  9. 基于jQuery功能非常强大的图片裁剪插件

    今天我们要来介绍一款基于jQuery功能非常强大的图片裁剪插件,这款jQuery图片裁剪插件可以选择裁剪框的尺寸比例,可以设置高宽尺寸,同时可以设置图片翻转角度,当然也支持图片的缩放,裁剪框也可以用鼠 ...

随机推荐

  1. mybatis对java自定义注解的使用——入门篇

    最近在学习spring和ibatis框架. 以前在天猫实习时做过的一个小项目用到的mybatis,在其使用过程中,不加思索的用了比较原始的一种持久化方式: 在一个包中写一个DAO的接口,在另一个包里面 ...

  2. vue搭建开发环境

    windows下搭建vue开发环境 一.安装node.js 安装   vue项目通常通过webpack工具来构建,而webpack命令的执行是依赖node.js环境,所以首先要安装node.js. n ...

  3. HNOI(湖南省选试题)——永无乡

    今天写了一道十分巧妙的数据结构题---永无乡 (看的题解......) 永无乡包含 n 座岛,编号从 1 到 n,每座岛都有自己的独一无二的重要度,按照重要度可 以将这 n 座岛排名,名次用 1 到 ...

  4. JavaScript作用域链和垃圾回收机制

    作用域链 基本概念: 在了解作用域链和内存之前,我们先了解两个概念,分别是执行环境和变量对象. 执行环境:定义变量或者函数有权访问的其他数据,决定了它们各自的行为.每个对象都有自己的执行环境. 变量对 ...

  5. 使用Python对Excel进行读写操作

    学习Python的过程中,我们会遇到Excel的读写问题.这时,我们可以使用xlwt模块将数据写入Excel表格中,使用xlrd模块从Excel中读取数据.下面我们介绍如何实现使用Python对Exc ...

  6. 利用NSURLSession下载视频,图片,能实现断点续传

    首先分析下载资源到本地,就得有URL ,点击btn ,就会解析网络地址,获取数据,就得有进度条控件 NSURLSession类的实现,通过委托代理模式去实现一些方法,需遵守<NSURLSessi ...

  7. (一) 这就是所谓的Node.js------单线程,非阻塞,事件驱动

    Node.js 第一天笔记(V1) 一:Node.js到底是从何而来 2008年的秋天,一个名叫做Ryan Dahl(罗伊・达尔)的年轻人在玩了几年服务器编程之后,越发感到服务器高并发性能的瓶颈是一个 ...

  8. 使用SevenZipSharp压缩/解压7z格式

    7z格式采用的LZMA算法,号称具有现今最高压缩率.笔者在nuget上搜索7z,在搜索结果中最终选择了SevenZipSharp来进行压缩/解压.不得不说,SevenZipSharp的API设计得非常 ...

  9. Async/Await替代Promise的6个理由

    译者按: Node.js的异步编程方式有效提高了应用性能:然而回调地狱却让人望而生畏,Promise让我们告别回调函数,写出更优雅的异步代码:在实践过程中,却发现Promise并不完美:技术进步是无止 ...

  10. robotium问答

    robotium问答   robotium集成instrumentation robotium如何定位控件? search类获取当前所有的view,然后根据类型或者文本去筛选,找到view后获取坐标, ...