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

techbrood 发表于 2016-05-18 18:45:14

标签: canvas, html5, 图像, 编辑, 裁剪

- +

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

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

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

下载.png

构建界面布局和元素

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


possitive(13) views23253 comments1

发送私信

最新评论

iefreer 2016-05-18 18:47:22

Read more on canvas basics:
http://techbrood.com/h5b2a?p=html-canvas-overview


请先 登录 再评论.
相关文章
  • 2019年开源WebRTC媒体服务器选型比较

    什么是WebRTC服务器?在WebRTC的早期开始,该技术的主要卖点之一是它允许点对点(浏览器到浏览器)通信,几乎没有服务器的干预,服务器通常仅用于信令(比如用于...

  • html5跨平台实战-第一周-水平测验-新闻列表页面

    这是一个DIV+CSS布局页面的一个实例,主要介绍POSITION定位、导航UL LI的制作、利用浮动原理对页面分栏、分列的页面布局。新闻页面的效果图

  • 踏得网精选2016年度10大最佳HTML5动画

    踏得网精选2016年度最酷最新的HTML5动画集,评选标准为:创意新颖度+实现技术难度+趣味程度。使用一些在线H5生成工具的作品,因其主要使用图片和CSS3套路动画,...

  • HTML5动画背后的数学2 - 仿生智能算法综述

    本文是前文

  • Babylon.js入门教程和开发实例

    Babylon.js是一款WebGL开发框架。和Three.js类似。主要的技术区别是Three.js还试图回退兼容CSS 3D。Three.js是完全社区推动的,比Babylon.js要成熟些,而Babylon...

  • 学习使用CSS制作进度条

    进度条是基础的界面控件,可用于多种场合,比如任务完成进度,手机充电状态等。本文介绍一个简单实用的进度条制作方法。预期效果如下图所示:直观上,我们可以把该进度条控件分为2个部分,外部的边界用来表示固定的目标范围,里面的条形部分用来表示当前进度。外部目标范围元素的CSS代码编写如下:.pb-scope

  • 深入理解Three.js(WebGL)贴图(纹理映射)和UV映射

    本文将详细描述如何使用Three.js给3D对象添加贴图(Texture Map,也译作纹理映射,“贴图”的翻译要更直观,而“纹理映射”更准确。)。为了能够查看在线演示效...

  • 粒子运动模拟 - Verlet积分算法简介

    Verlet算法是经典力学(牛顿力学)中的一种最为普遍的积分方法,被广泛运用在分子运动模拟(Molecular Dynamics Simulation),行星运动以及织物变形模拟等领域...

  • Three.js入门教程5 - 10个必须知道的编程技巧

    作者为Google的Paul,关于如何写出好的WebGL代码的文章。和很多开发者一样,我通过实践学习,但同时我也向其他更有经验的开发者们学习。在过去的几个月中,我在c...

  • Three.js入门教程1 - 基础知识和创建一个红色球体

    [ TECHBROOD注:Three.js是一个主流的开源WebGL库,WebGL允许使用JavaScript直接操作GPU,在网页上实现3D效果。
    Google的工程师Paul在网站aerotwist.com上...

  • 使用Canvas绘制完美的不完美圆形

    真实世界是不完美的,当我们需要模拟真实世界时,经常需要引入不完美/不规则的形状。比如陨石、雨滴、行星、树叶、绵延的海岸线、云朵等。本文介绍如何基于Canva...

  • 使用top/left/margin和CSS3 translate两种方法实现标题居中的性能差异详解

    要实现标题全屏居中(同时在垂直和水平方向居中),有若干种方法,包括使用弹性布局、表格单元、绝对定位、自动外边距和CSS3平移变换等。你可能已经使用了这些方...

  • D3.js读取外部json数据

    D3.js是一个很好的数据可视化工具,支持从web服务读取json数据,或者从外部文件如.json, .csv文件中直接读取。由于部分服务比如flickrs上的图文数据服务需要VPN...

  • 使用纯CSS3实现一个3D旋转的书本

    有一些前沿的电商网站已经开始使用3D模型来展示商品并支持在线定制,而其中图书的展示是最为简单的一种,无需复杂的建模过程,使用图片和CSS3的一些变换即可实现...

  • SVG过滤器feColorMatrix矩阵变换效果用法详解

    在计算机图形学(数学)中,矩阵乘法可用于把空间向量进行几何变换。我们可以把颜色的值(RGBA)表示成一个四维空间向量:color = (r, g, b, a);那么就可以应用...

  • 更多...