cropper.js裁剪图片的使用

官网http://fengyuanchen.github.io/cropper/
文档https://github.com/fengyuanchen/cropper/blob/master/README.md

引入js

<link  href="/path/to/cropper.css" rel="stylesheet">
<script src="/path/to/cropper.js"></script>
<!-- 建议把单独的img标签放在一个div中 包裹画布-->
<div class="box">
  <img id="image" src="picture.jpg">
</div>

这里注意,直接设置img的宽高是没有效果的,但是可以在父盒子上(即.box)设置

官方引入方式
    var cropper = new Cropper(image, {
        aspectRatio: 16 / 9,
        viewMode:1,
        crop: function (e) {
            console.log(e.detail.x);
            console.log(e.detail.y);
            console.log(e.detail.width);
            console.log(e.detail.height);
            console.log(e.detail.rotate);
            console.log(e.detail.scaleX);
            console.log(e.detail.scaleY);
        }
    });
本地引入方式

如果使用的是本地的cropper.js和cropper.css,可能报版本的错误,用下面的引入代码:

    $('#image').cropper({
        aspectRatio: 16 / 9,
        viewMode:1,
        crop: function (e) {
            console.log(e);
        }
    });

参数 options

    1. viewMode:定义cropper的视图模式
      默认:0
      0:没有限制,3可以移动到2外。
      1 : 3只能在2内移动。
      2:2图片 不全部铺满1 (即缩小时可以有一边出现空隙)
      3:2图片填充整个1
    1. dragMode:定义cropper的拖拽模式
      默认: ‘crop’
      ‘crop’: 可以产生一个新的裁剪框3
      ‘move’: 只可以移动3
      ‘none’: 什么也不处理
    1. aspectRatio:裁剪框的宽高比
      默认:NAN;
      在默认的时候可以随意改变裁剪框的大小,我这里的设置的值为 16/9。
    1. preview:添加额外的元素(容器)以供预览
      默认:“ ”;
      注意这里是一个dom元素,必须可以被Document.querySelectorAll获取到。
      preview:".small",
      <div class="small"></div>
      一定要设置small的宽高,如果想显示出裁剪的区域需要加上样式 overflow: hidden;
    1. data:如果已经存储了以前的数据,那么在构建时将会自动将其传递给setData方法。
      默认:null;
    1. responsive:在调整窗口大小的时候重新渲染cropper
      默认:true;
    1. restore:在调整窗口大小后恢复裁剪的区域
      默认:true;
    1. checkCrossOrigin:检查当前图像是否为跨域图像
      默认:true;
    1. checkOrientation:检查当前图像的Exif定向信息
      默认:true;
    1. modal:显示图片上方的黑色模态并在裁剪框下面
      默认:true;
    1. guides:显示在裁剪框上方的虚线
      默认:true;
    1. center:裁剪框在图片正中心
      默认:true;
    1. highlight:在裁剪框上方显示白色的区域(突出裁剪框)
      默认:true;
    1. background:显示容器的网格背景
      就是后面的马赛克
      默认:true;
    1. autoCrop:当初始化时,可以自动生成图像
      就是自动显示裁剪框,改成false裁剪框自动消失
      默认:true;
    1. autoCropArea:定义自动裁剪面积大小(百分比)和图片进行对比
      默认:0.8;
      就是裁剪框显示的大小
    1. movable:是否允许可以移动后面的图片
      默认:true;
    1. rotatable:是否允许旋转图像
      默认:true;
    1. scalable:是否允许缩放图像
      默认:true;
    1. zoomable:是否允许放大图像
      默认:true;
    1. zoomOnTouch:是否可以通过拖动触摸来放大图像
      默认:true;
    1. zoomOnWheel:是否可以通过移动鼠标来放大图像
      默认:true;
    1. wheelZoomRatio:用鼠标移动图像时,定义缩放比例
      默认:0.1;
    1. cropBoxMovable:是否通过拖拽来移动剪裁框
      默认:true;
      改成false效果图为:剪裁框不可以拖动
    1. cropBoxResizable:是否通过拖动来调整剪裁框的大小
      默认:true;
      改成false效果图为:剪裁框不可以调整大小
    1. toggleDragModeOnDblclick:当点击两次时可以在“crop”和“move”之间切换拖拽模式
      默认:true;
    1. minContainerWidth:容器的最小宽度
      默认:200;
    1. minContainerHeight:容器的最小高度
      默认:100;
    1. minCanvasWidth:canvas的最小宽度
      默认:0;
    1. minCanvasHeight:canvas的最小高度
      默认:0;
    1. minCropBoxWidth:裁剪层的最小宽度
      默认:0;
    1. minCropBoxHeight:裁剪层的最小高度
      默认:0;
    1. ready:插件准备完成执行的函数(只执行一次)
      类型:Function
      默认:null;
    1. cropstart—剪裁框开始移动执行的函数
      类型:Function
      默认:null;
    1. cropmove—剪裁框移动时执行的函数
      类型:Function
      默认:null;
    1. cropend—剪裁框移动结束执行的函数
      类型:Function
      默认:null;
    1. crop—剪裁框发生变化执行的函数
      类型:Function
      默认:null;
    1. zoom—剪裁框缩放的时候执行的函数
      类型:Function
      默认:null;

Methods 方法

    1. crop() 手动显示裁剪框
$("#image").cropper({
  autoCrop: false, //关闭自动显示裁剪框
  ready: function () {
    $(this).cropper('crop');
  }
});
    1. reset():将图像和裁剪框重置为初始状态
    1. clear():清除裁切框
    1. replace(url[, onlyColorChanged]):替换图像的src并重新构建cropper
      url:类型String,新图片的url
      onlyColorChanged (optional):类型Boolean,默认false;
      如果只是改变颜色,而不是大小,那么cropper只需要改变所有相关图像的src,不需要重新构建cropper。这可以用于应用过滤器。(意思是:改成true,图像的比例会发生变化自适应父盒子的大小;会失真的)
    $("#replace").on("click", function () {
        $('#image').cropper('replace',"./images/111.jpeg",true );
    })
    1. enable():解锁,锁定的裁切框(与disable相对应)
    1. disable():锁定的裁切框(裁切框不可移动)(与enable相对应)
    1. destroy():销毁cropper并从图像中删除整个cropper
    1. move(offsetX[, offsetY]):使用相对偏移量移动图像(裁切框不移动)
    1. moveTo(x[, y]):将画布(图像包装器)移动到一个绝对点
    1. zoom(ratio):放大图片,并使用相对比例(裁切框不变化)
    1. zoomTo(ratio):将画布(图像包装器)放大到一个绝对比例
    1. rotate(degree):旋转图像以一定的角度
    1. rotateTo(degree):旋转图像到固定的角度
    1. scale(scaleX[, scaleY]):翻转图像
      scaleX:类型Number;水平方向翻转;默认为 1
      scaleY:类型Number;垂直方向翻转;如果不存在,其值和scaleX相同;
$('#image').cropper('scale', -1); // 水平、垂直方向翻转
$('#image').cropper('scale', -1, 1); // 水平方向翻转
$('#image').cropper('scale', 1, -1); // 垂直方向翻转
    1. scaleX(scaleX):缩放图像的横坐标
    1. scaleY(scaleY):缩放图像的纵坐标
    1. getData([rounded]):输出最终裁剪的区域位置和大小数据(根据原始图像的自然大小)
      rounded 类型Boolean;默认false;设置true可以获取其所有数据;
      返回的数据类型:Object;
      x裁切框距离左边的距离
      y裁切框距离顶部的距离
      width裁切框的宽度
      height裁切框的高度
      rotate裁切框的旋转的角度
      scaleX缩放图像的横坐标
      scaleY缩放图像的纵坐标
    $("#getData").on("click", function () {
        console.log($('#image').cropper('getData', true));;
    })
    1. setData(data):用新数据改变裁切区域的位置和大小(以原始图像为基础)
    1. getContainerData():输出container 容器大小数据
    1. getImageData():输出图像image位置、大小和其他相关数据
      返回的数据类型:Object;
      leftimage距离左边的距离
      topimage距离顶部的距离
      widthimage的宽度
      heightimage的高度
      naturalWidth image的原始宽度
      naturalHeight image的原始高度
      aspectRatio image的纵横比
      rotateimage的旋转的角度
      scaleX缩放图像的横坐标
      scaleY缩放图像的纵坐标
    $("#getImageData").on("click", function () {
        console.log($('#image').cropper('getImageData', ));;
    })
    1. getCanvasData():输出画布Canvas(图像包装器)位置和大小数据
      返回的数据类型:Object;
      leftcanvas距离左边的距离
      topcanvas距离顶部的距离
      widthcanvas的宽度
      heightcanvas的高度
      naturalWidth canvas的原始宽度
      naturalHeight canvas的原始高度
      注意:getImageData() 和 getCanvasData()的naturalWidthnaturalHeight的值是一样的
    1. setCanvasData(data):使用数据更改画布Canvas(图像包装器)位置和大小
    1. getCropBoxData():输出剪切框的位置和大小数据
    1. setCropBoxData(data):改变剪切框的位置和大小数据
    1. getCroppedCanvas([options]):画一张剪裁的图片,如果没有剪裁,则返回一个绘制整个im的画布
      options 类型Object
      width 输出Canvas的宽度
      height 输出Canvas的高度
      minWidth 输出Canvas的最小宽度;默认值是0
      minHeight 输出Canvas的最小高度;默认值是0
      maxWidth 输出Canvas的最大宽度;默认值是Infinity(无穷大)
      maxHeight 输出Canvas的最大高度;默认值是Infinity(无穷大)
      fillColor 在输出画布Canvas中填充任何alpha的颜色,默认值是透明的
      imageSmoothingEnabled 如果图像被设置为平滑(true,默认)或不设置(false)。
      imageSmoothingQuality 设置图像的质量,一个“low”(默认)、“medium”或“high”。
      返回值类型:HTMLCanvasElement
      画布绘制出了剪裁过的图像
      注意:输出canvas画布的宽高比将自动适应剪切框的纵横比
      如果您打算从输出画布canvas中获得一个JPEG图像,您应该首先设置填色选项,否则,JPEG图像中的透明部分将在缺少情况下变为黑色。
      为了避免获得空白的输出图像,您可能需要将maxWidth和maxHeightproperties设置为有限的数字,从而来画布元素的大小限制。
    $("#getCroppedCanvas").on("click", function () {
        console.log($('#image').cropper('getCroppedCanvas'));;
        var cas=$('#image').cropper('getCroppedCanvas');
        var base64url=cas.toDataURL('image/jpeg');
        cas.toBlob(function (e) {
            console.log(e);  //生成Blob的图片格式
        })
        console.log(base64url); //生成base64图片的格式
        $('.cavans').html(cas)  //在body显示出canvas元素
    })
$('#image').cropper('getCroppedCanvas', {
  width: 160,
  height: 90,
  minWidth: 256,
  minHeight: 256,
  maxWidth: 4096,
  maxHeight: 4096,
  fillColor: '#fff',
  imageSmoothingEnabled: false,
  imageSmoothingQuality: 'high',
});

// Upload cropped image to server if the browser supports `HTMLCanvasElement.toBlob`
$('#image').cropper('getCroppedCanvas').toBlob(function (blob) {
  var formData = new FormData();
  formData.append('croppedImage', blob);
  $.ajax('/path/to/upload', {
    method: "POST",
    data: formData,
    processData: false,
    contentType: false,
    success: function () {
      console.log('Upload success');
    },
    error: function () {
      console.log('Upload error');
    }
  });
});
    1. setAspectRatio(aspectRatio):改变裁切框的宽高比
    1. setDragMode([mode]):设置拖拽模式
      就是鼠标显示的是十字还是那种带箭头的十字
      mode 类型String
      取值:none、crop、move;
      默认none

Events事件

    1. ready:当一个cropper实例完全构建时,这个事件就会发生
    1. cropstart:当画布(图像包装器)或剪切框开始发生变化时,该事件就会发生
      返回的参数有:
      event.originalEvent 类型event;
      mousedowntouchstartpointerdown 即触发的事件源
      event.action 发生事件的行为(移动的方向):
      crop:创建一个剪切框的时候
      move:移动图片的时
      zoom:放大缩小canvas的时候
      e:调整剪切框东侧的大小
      w:调整剪切框西侧的大小
      s:调整剪切框南侧的大小
      n:调整剪切框北侧的大小
      se:东南
      sw:西南
      ne:东北
      nw:西北
      all:所有方向
$('#image').on('cropstart', function (e) {
  console.log(e.type); // cropstart
  console.log(e.namespace); // cropper
  console.log(e.action); // ...
  console.log(e.originalEvent.pageX);

  // Prevent to start cropping, moving, etc if necessary
  if (e.action === 'crop') {
    e.preventDefault();
  }
});
    1. cropmove:当画布(图像包装器)或剪切框正在发生变化时,该事件就会发生
    1. cropend:当画布(图像包装器)或剪切框正在发生变化结束时,该事件就会发生
    1. crop:当画布(图像包装器)或农作物盒发生改变时,该事件就会发生
    1. zoom:当一个cropper实例开始放大或缩小画布(图像包装器)时,这个事件就会发生
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容