Canvas实例教程:图像移动、大小调整和裁剪

原创 2014年11月03日 21:28:53

本文介绍如何使用JavaScript和HTML5 Canvas元素来移动、调整大小和裁剪图像,这些技术适用于图片编辑器、照片分享等应用场景。

一般而言图像的剪裁会放在服务端进行,但是图片传送会消耗较多的流量。借助HTML5 Canvas绘图功能,可以在浏览器端以比较简单的方式来实现。

代码和在线演示地址:http://wow.techbrood.com/fiddle/2580,可以先操作下,有个整体印象,界面截图如下:


构建界面布局和元素

HTML页面由源图片Crop操作按钮裁剪矩形框以及图片容器(含4个角的调整小方块)组成,主体代码如下:

<div class="component">
    <div class="overlay">
        <div class="overlay-inner">
        </div>
    </div>
    <img class="resize-image" src="/assets/beauty.jpg" alt="image for resizing">
    <button class="btn-crop js-crop">Crop<img class="icon-crop" src="/assets/crop.svg">
    </button>
</div>

img[class=resize-image] 元素为本服务器图片资源,是要进行调整和裁剪的图片。注意出于安全策略,不能在浏览器中跨域操作图片,否则会出现类似下面的报错信息:

Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported.

button[class=btn-crop] 是SVG矢量图标按钮。

div[class=overlay] 元素是裁剪矩形框。

此外图片容器使用JavaScript动态包装在 img[class=resize-image] 元素外部:

// Wrap the image with the container and add resize handles
$('.resize-image').wrap('<div class="resize-container"></div>')
    .before('<span class="resize-handle resize-handle-nw"></span>')
    .before('<span class="resize-handle resize-handle-ne"></span>')
    .after('<span class="resize-handle resize-handle-se"></span>')
    .after('<span class="resize-handle resize-handle-sw"></span>');
 

实现大小调整的功能

大小调整通过先在Canvas上绘制一个对应大小的图像,接着通过Canvas的toDataURL方法转化为base64编码的字符串形式的图片数据。
最后把该data:URL通过设置为img的src属性,附着到目标图像元素上。

resizeImage = function(width, height){
    resize_canvas.width = width;
    resize_canvas.height = height;
    resize_canvas.getContext('2d').drawImage(orig_src, 0, 0, width, height);   
    $('.resize-image').attr('src', resize_canvas.toDataURL("image/png"));  
};
实现移动功能

通过mouseup事件获取新的位置,然后通过jQuery的offset方法来完成元素偏移。

moving = function(e){
    var  mouse={};
    e.preventDefault();
    e.stopPropagation();
    mouse.x = (e.clientX || e.pageX) + $(window).scrollLeft();
    mouse.y = (e.clientY || e.pageY) + $(window).scrollTop();
    $container.offset({
        'left': mouse.x - ( event_state.mouse_x - event_state.container_left ),
        'top': mouse.y - ( event_state.mouse_y - event_state.container_top ) 
    });
};
实现裁剪功能

这个主要是实现一个居中的覆盖矩形(overlay),接着通过计算背景图片和该覆盖矩形的偏移来获取图片裁剪区域的坐标,

然后再通过Canvas的drawImage和toDataURL完成裁剪图的绘制。

crop = function(){
    var crop_canvas,
        left = $('.overlay').offset().left - $container.offset().left,
        top =  $('.overlay').offset().top - $container.offset().top,
        width = $('.overlay').width(),
        height = $('.overlay').height();
         
    crop_canvas = document.createElement('canvas');
    crop_canvas.width = width;
    crop_canvas.height = height;
     
    crop_canvas.getContext('2d').drawImage(image_target, left, top, width, height, 0, 0, width, height);
    window.open(crop_canvas.toDataURL("image/png"));
}
最后再加上一些移动功能,如触摸事件(Touch)和手势(Gesture)检测的支持。

参考链接

1. http://madebymike.com.au/

2. http://stackoverflow.com/questions/18922880/html5-canvas-resize-downscale-image-high-quality

3. http://www.techbrood.com/ideas?q=Makethumbnails

by iefreer

版权声明:本文为博主原创文章,未经博主允许不得转载。

Canvas实例教程:图像移动、大小调整和裁剪

学习如何使用JavaScript和HTML5 Canvas元素来调整和裁剪图像(Resizing and Cropping Images with Canvas。),适用于图片编辑器、照片分享等应用场...
  • iefreer
  • iefreer
  • 2014年11月03日 21:28
  • 42511

html5图片裁剪控件原型【含缩放,旋转,拖动功能】---2、核心代码

推荐这一篇文章是早年为了解决图片裁剪的探索性文章,现在已经开放出了falsh版及html5版本的图片裁剪插件,各位有时间可以看看: 浮士德html5图片裁剪器2016开源版 浮士德头像裁剪flas...
  • cdnight
  • cdnight
  • 2015年08月21日 11:25
  • 7326

简单功能强大的jQuery图片剪裁插件Image Cropper

相信很多朋友都在大型的网站,如新浪微博、QQ微博上看到过头像裁图工具,感觉很高大尚吧,今天朋友们有福了,今天就来说一说一款这么高大尚的插件cropper,cropper是一款使用简单且功能强大的图片剪...
  • guanglovemiao
  • guanglovemiao
  • 2016年07月22日 09:24
  • 5774

深度剖析IE10对HTML5 Canvas支持及实例教程(一)

什么是HTML5?          HTML5 是用于取代 1999 年所制定的 HTML 4.01 和 XHTML 1.0 标准的 HTML标准版本,HTML5有两大特点,强化了 Web 网页的...
  • liwei3gjob
  • liwei3gjob
  • 2013年05月29日 16:30
  • 6576

Dreamweaver 8中文版实例教程 第4章 网页中的图像处理

  • 2011年09月21日 09:47
  • 3.73MB
  • 下载

《MATLAB R2008数字图像处理与分析实例教程》part3

  • 2015年04月23日 22:41
  • 14.74MB
  • 下载

中文 Photoshop cs 图像实例教程

  • 2009年11月17日 09:51
  • 14.46MB
  • 下载

【开源】canvas图像裁剪、压缩、旋转

前言前段时间遇到了一个移动端对图像进行裁剪、压缩、旋转的需求。 考虑到已有各轮子的契合度都不高,于是自己重新造了一个轮子。关于图像裁剪、压缩在HTML5时代,canvas的功能已经非常强大了,可以进...
  • u010979495
  • u010979495
  • 2017年11月16日 10:56
  • 57

使用Jcrop-canvas画布-制作前端图像裁剪

写在前面 –公司需要这个需求,安排调查 –目前各大网站都是采用的-前端做裁剪返回坐标-由后端来做到裁剪 –而使用html-canvas画布可以直接前端裁剪并返回base64流-ajax可以直接下...
  • Artisters
  • Artisters
  • 2017年05月11日 23:23
  • 200

支持移动端图像裁剪模板

  • 2016年08月17日 16:27
  • 67KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Canvas实例教程:图像移动、大小调整和裁剪
举报原因:
原因补充:

(最多只允许输入30个字)