资讯专栏INFORMATION COLUMN

【jQuery插件分享】Cropper——一个简单方便的图片裁剪插件

阿罗 / 2628人阅读

摘要:在裁剪框外拖动鼠标会生成一个新的裁剪框。这个是裁剪框的纵横比,默认是不限制的。初始化完成后是否自动显示裁剪框自动显示的裁剪框的大小。方法的使用格式为手动显示裁剪框。

插件介绍

这是一个我在写以前的项目的途中发现的一个国人写的jQuery图像裁剪插件,当时想实现用户资料的头像上传功能,并且能够预览图片,和对图片进行简单的裁剪、旋转,花了不少时间才看到了这个插件,感觉功能挺全面,代码实现起来也挺简单,再加上用的是Bootstrap,对移动端操作也有适配,于是就用了。现在稍微有点时间就记录一下,方便以后再用的时候查阅。另外也有对应的js版本。

官方文档(英文)

jQuery

GitHub项目地址

官方示例

js

GitHub项目地址

兼容性

兼容所有支持了Canvas的浏览器(IE9+),一小部分功能例外,具体请查看官方文档。

参数 viewMode

Type: Number

Default: 0

Options: 0,1,2,3

这个具体每个值对应的效果我也不是很清楚,推荐在上面的官方示例里都试一试,我都是比较喜欢2。

dragMode

Type: String

Default: "crop"

Options:

"crop": 在裁剪框外拖动鼠标会生成一个新的裁剪框。

"move": 在裁剪框外拖动鼠标会移动原图。

"none": 在裁剪框外拖动鼠标则什么也不做。

aspectRatio

Type: Number

Default: NaN

这个是裁剪框的纵横比,默认是不限制的。例如1:1的头像就写1,16:9可写成16 / 9

data

Type: Object

Default: null

The previous cropped data if you had stored, will be passed to setData method automatically.

(没怎么用过,都是直接用setData方法)

preview

Type: String (jQuery selector)

Default: ""

预览图的位置,用jQuery选择器表示。

responsive

Type: Boolean

Default: true

在更改窗口大小后是否重新渲染cropper。

restore

Type: Boolean

Default: true

在更改窗口大小后是否恢复裁剪区域。

checkCrossOrigin

Type: Boolean

Default: true

检查图像是否是跨域图像。(具体查看官方文档)

checkOrientation

Type: Boolean

Default: true

(具体查看官方文档)

modal

Type: Boolean

Default: true

非裁剪区域是否用黑罩遮盖。

guides

Type: Boolean

Default: true

裁剪区域是否显示虚线。

center

Type: Boolean

Default: true

裁剪区域正中央是否显示+号。

highlight

Type: Boolean

Default: true

裁剪区域是否高亮显示。

background

Type: Boolean

Default: true

是否显示背景的黑白方格(类似PS里透明图层的显示方式)。

autoCrop

Type: Boolean

Default: true

cropper初始化完成后是否自动显示裁剪框

autoCropArea

Type: Number

Default: 0.8 (80% of the image)

自动显示的裁剪框的大小。因此,数字应当在0~1之间。

movable

Type: Boolean

Default: true

是否允许移动原图。(如果这里填false那么尽管dragMode的值是move,在裁剪框外拖动也不会移动原图)

rotatable

Type: Boolean

Default: true

是否可以旋转原图。

scalable

Type: Boolean

Default: true

是否可以对原图进行纵横拉伸。

例如把原图宽度拉长为原来的2倍或者拉长为原来的-1倍(即水平翻转)。

zoomable

Type: Boolean

Default: true

是否可以对原图进行缩小放大。

zoomOnTouch

Type: Boolean

Default: true

是否允许在移动端上使用双指触摸缩放原图。

zoomOnWheel

Type: Boolean

Default: true

是否允许使用鼠标滚轮缩放原图。

wheelZoomRatio

Type: Number

Default: 0.1

当使用鼠标滚轮缩放时的比例。

cropBoxMovable

Type: Boolean

Default: true

是否允许移动裁剪框。

cropBoxResizable

Type: Boolean

Default: true

是否允许通过拖动裁剪框的边框来调整裁剪框的大小。

toggleDragModeOnDblclick

Type: Boolean

Default: true

是否允许通过双击来在cropmove之间切换dragMode

minContainerWidth

Type: Number

Default: 200

容器宽度最小值。

minContainerHeight

Type: Number

Default: 100

容器高度最小值。

minCanvasWidth

Type: Number

Default: 0

canvas(原图)宽度最小值。

minCanvasHeight

Type: Number

Default: 0

canvas(原图)高度最小值。

minCropBoxWidth

Type: Number

Default: 0

剪切框宽度最小值。

Note: This size is relative to the page, not the image.

minCropBoxHeight

Type: Number

Default: 0

剪切框高度最小值。

Note: This size is relative to the page, not the image.

ready

Type: Function

Default: null

A shortcut of the "ready" event.

cropstart

Type: Function

Default: null

A shortcut of the "cropstart" event.

cropmove

Type: Function

Default: null

A shortcut of the "cropmove" event.

cropend

Type: Function

Default: null

A shortcut of the "cropend" event.

crop

Type: Function

Default: null

A shortcut of the "crop" event.

zoom

Type: Function

Default: null

A shortcut of the "zoom" event.

常用方法

除了"setAspectRatio","replace"和"destroy"以外,所有的方法都要在ready后才能使用。这里只介绍几个常用的方法,全部的方法请到官方文档查阅。

方法的使用格式为

$().cropper("method",arg0,arg1,arg2,...);
crop()

手动显示裁剪框。

$().cropper({
  autoCrop: false,
  ready: function () {
    // Do something here
    // ...

    // And then
    $(this).cropper("crop");
  }
});
reset()

恢复全部到初始状态。

replace(url[, onlyColorChanged])

url:

Type: String

A new image url.

onlyColorChanged (optional):

Type: Boolean

If only change the color, not the size, then the cropper only need to change the srcs of all related images, not need to rebuild the cropper. This can be used for applying filters.

If not present, its default value is false.

替换cropper中的图像文件,通常第二个参数不管。

destroy()

销毁cropper,并且会移除img标签的src属性的值。

getCroppedCanvas([options])

options (optional):

Type: Object

Properties:

width: the destination width of the output canvas.

height: the destination height of the output canvas.

minWidth: the minimum destination width of the output canvas, the default value is 0.

minHeight: the minimum destination height of the output canvas, the default value is 0.

maxWidth: the maximum destination width of the output canvas, the default value is Infinity.

maxHeight: the maximum destination height of the output canvas, the default value is Infinity.

fillColor: a color to fill any alpha values in the output canvas, the default value is transparent.

imageSmoothingEnabled: set to change if images are smoothed (true, default) or not (false).

imageSmoothingQuality: set the quality of image smoothing, one of "low" (default), "medium", or "high".

(return value):

Type: HTMLCanvasElement

A canvas drawn the cropped image.

Notes:

输出的canvas的纵横比会自动适应于裁剪框的纵横比.

如果打算得到JPEG图像,那么应该先设置fillColor参数,否则裁剪后的透明部分默认会由黑色填充。

Browser support:

Basic image: requires Canvas support (IE 9+).

Rotated image: requires CSS3 2D Transforms support (IE 9+).

Cross-origin image: requires HTML5 CORS settings attributes support (IE 11+).

得到裁剪到的图像的canvas,如果没有裁剪,那么就返回的是整个原图图像的canvas。

这是最重要的一个方法,通过这个方法就可以得到裁剪后的图像,再使用toDataURL()得到base64 dataURL(不指定格式的话会是png格式)或者toBlob()得到Blob,然后就可以很轻松地将图片上传至服务器上或者显示在某个img标签中了。例如:

// 转换为png格式的dataURL
var dataURL = $().cropper("getCroppedCanvas", {
    width:100,
    height:100
}).toDataURL("image/png");

// 转换为Blob后显示在img标签中
var URL = window.URL || window.webkitURL;
$().cropper("getCroppedCanvas", {
    width:100,
    height:100
}).toBlob(function (blob) {
    $().attr("src",URL.createObjectURL(blob));
});
简单实例 在页面直接使用cropper

接下来只是实现一个简单的功能:网页中可以上传图片,然后对图片进行裁剪,点击确定后会显示出裁剪后的图片。

代码如下:





裁剪图片





结果:

使用cropper来上传图片到服务器

由于cropper可以得到两种裁剪后图片的数据(即blob和dataURL),所以对应的上传到后台也会有两种方法,在这里我只写一种使用ajax上传base64 dataURL的,另一种方法如果有兴趣,可以自己尝试。

页面中,将上面的sendPhoto方法改为:

var sendPhoto = function () {
    // 得到PNG格式的dataURL
    var photo = $("#photo").cropper("getCroppedCanvas", {
        width: 300,
        height: 300
    }).toDataURL("image/png");

    $.ajax({
        url: "上传地址", // 要上传的地址
        type: "post",
        data: {
            "imgData": photo
        },
        dataType: "json",
        success: function (data) {
            if (data.status == 0) {
                // 将上传的头像的地址填入,为保证不载入缓存加个随机数
                $(".user-photo").attr("src", "头像地址?t=" + Math.random());
                $("#changeModal").modal("hide");
            } else {
                alert(data.info);
            }
        }
    });
}

后台中,Java的主要代码如下:(使用了jdk8的Base64,,如果是低版本请自行替换)

    /**
     * 将Base64位编码的图片进行解码,并保存到指定目录
     */
    public static void decodeBase64DataURLToImage(String dataURL, String path, String imgName) throws IOException {
        // 将dataURL开头的非base64字符删除
        String base64 = dataURL.substring(dataURL.indexOf(",") + 1);
        FileOutputStream write = new FileOutputStream(new File(path + imgName));
        byte[] decoderBytes = Base64.getDecoder().decode(base64);
        write.write(decoderBytes);
        write.close();
    }
小结

cropper能做到的事情还很多,这里只是简单使用了一下,更多功能可以在有想法的再研究下。

这是针对以前项目用的cropper的一个整理,结果因为当初没有看官方例子,途中发现了在模态框中使用的一个bug,以后会注意这方面。另外,整理这部分资料时也参考了不少的网络资料,在这里就不一一记录了。

最后,由于本人能力有限,若发现错误希望能指出,本人会及时改正,非常感谢。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90285.html

相关文章

  • JQuery 插件图片裁剪插件cropper.js使用,上传

    摘要:图片裁剪,压缩是上传图片一定会遇到的问题。如何获得裁剪的图片呢获取裁剪后的图片信息首先我们可以获得裁剪框的节点然后调用图片质量图片质量越好图片大小越大这样就得到了你裁剪的图片了可以通过,放到你想要的节点里展示。 图片裁剪,压缩是上传图片一定会遇到的问题。这里把我测试cropper.js这款jquery插件的心得分享一下,可以给新手做参考。 引入插件相关文件,你们down到本地也可以。这...

    SHERlocked93 评论0 收藏0
  • 基于 Vue图片裁剪插件

    摘要:预览项目地址一些想法网上看了看基于的图片裁剪的插件很少,刚刚好项目需要使用到图片裁剪,于是便有了这个插件的诞生。 vue-crpopper 预览项目地址 一些想法 网上看了看基于vue的图片裁剪的插件很少,刚刚好项目需要使用到图片裁剪,于是便有了这个插件的诞生。 实现的原理 通过canvas生成新的图片, 可以上传到后台保存。 效果图 showImg(https://segmentfa...

    dance 评论0 收藏0
  • 立志做一个最好用移动端图片裁剪插件

    摘要:基于的图片压缩裁剪插件功能说明图片压缩,图片裁剪,图片压缩,图片裁剪,,解决了部分机型方向不对的问题,同时可以对图片进行尺寸和质量的压缩效果演示调试模式下或者手机打开本地运行使用本项目的文件需要引入在需要使用的页面直接引入 vue-image-cropper 基于vue的图片压缩裁剪插件 1.功能说明 图片压缩,图片裁剪,vue图片压缩,vue图片裁剪,vue-image-croppe...

    android_c 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<