cropperjs的简单使用

news2025/1/20 19:58:34

前言

最近发现了cropperjs,可以用于裁剪图片,特点来踩一下坑。

官方文档

参考文章:

cropper.js 裁剪图片并上传(文档翻译+demo)

1小时搞定cropper.js制作头像/图片上传、裁剪、并发送至后端

可以仿gitee的头像上传

下面的例子基于vue

基本使用

安装

npm install cropperjs

语法

new Cropper(element[, options])

element:元素,HTMLImageElement 或 HTMLCanvasElement
options:配置项,可选

官方例子

<img src="./aa.png" alt="图片" class="image" ref="imgRef" />
<el-button type="primary" @click="cropImage">裁剪</el-button>

cropImage() {
    const cropper = new Cropper(this.$refs.imgRef, {
        // 宽高比
        aspectRatio: 16 / 9,
        crop(event) {
            // console.log(event.detail.x);
            // console.log(event.detail.y);
            // console.log(event.detail.width);
            // console.log(event.detail.height);
            // console.log(event.detail.rotate);
            // console.log(event.detail.scaleX);
            // console.log(event.detail.scaleY);
        }
    });
    console.log(cropper);
}

在这里插入图片描述
有两点比较重要:
1、给图片添加这两个属性,官方文档说了很重要

/* Ensure the size of the image fit the container perfectly */
img {
  display: block;

  /* This rule is very important, please don't ignore this */
  max-width: 100%;
}

2、要导入样式,不然不会生效,像下面这样

import 'cropperjs/dist/cropper.css';
import Cropper from 'cropperjs';

在这里插入图片描述

常用属性

以下内容来自上面的这篇文章:cropper.js 裁剪图片并上传(文档翻译+demo) ,文章写的很详细

viewMode:定义cropper的视图模式
在这里插入图片描述
dragMode:定义cropper的拖拽模式

类型: String
默认: ‘crop’
选项:
‘crop’: 可以产生一个新的裁剪框3
‘move’: 只可以移动3
‘none’: 什么也不处理

aspectRatio:裁剪框的宽高比

值为1时,是一个圆形。

preview:添加额外的元素(容器)以供预览

文章作者给踩坑了
这里是一个dom元素。必须可以被Document.querySelectorAll获取到;
preview:“.small”,
HTML结构:<div class=“small”>;注意一定要设置small的宽高;最好和裁剪比例一致;还有如果要想正确的显示出裁剪的区域需要加上样式overflow: hidden;

按照上面简单试了一下,效果如图:

<div class="image-view"></div>
.image-view{
   width: 190px;
   height: 160px;
   //overflow很重要
   overflow: hidden;
}

在这里插入图片描述
background:显示容器的网格背景
默认true,显示马赛克背景,false时显示灰色背景色

rotatable:是否允许旋转图像。
默认true,允许旋转

scalable:是否允许缩放图像。
默认true,允许缩放

zoomable:是否允许放大图像。。
默认true,允许放大

scalablezoomable 都试了一下,scalable设为false还是可以通过鼠标滑轮缩放图片。但是zoomable设为false时,滑轮将不能再缩放图片

zoomOnTouch:是否可以通过拖动触摸来放大图像。
默认true,可以

cropBoxMovable:是否通过拖拽来移动剪裁框。
默认:true,裁剪框可以拖拽

cropBoxResizable:是否通过拖动来调整剪裁框的大小。
默认true,可以调整裁剪框大小

ready:插件准备完成执行的函数(只执行一次)。
默认null
例如:

ready: (event) => {
     console.log('准备完成:',event);
 },

cropstart:剪裁框开始移动执行的函数。
默认null

cropmove:剪裁框移动时执行的函数。
默认null

cropend:剪裁框移动结束执行的函数。
默认null

crop—剪裁框发生变化执行的函数。
默认:null

zoom:剪裁框缩放的时候执行的函数。
默认:null

方法

reset():将图像和裁剪框重置为初始状态

const cropper = new Cropper(this.$refs.imgRef, {
    // 宽高比
    aspectRatio: 16 / 9,
    viewMode: 1,
});

this.cropper = cropper;
this.cropper.reset();

通过Cropper生成的对象来调用相应的方法。

在这里插入图片描述

clear():清除裁切框

replace(url,true]):替换图像的src并重新构建cropper

destroy():销毁cropper并从图像中删除整个cropper。

zoom(ratio):缩放图片,并使用相对比例。(裁切框不变化)

 this.cropper.zoom(1.5);

注:1、会在上一次图片的大小上放大或缩小 2、如果zoomable设置未false,该函数将不起作用

rotate(degree):旋转图像以一定的角度
向右旋转 (degree > 0);向左旋转 (degree < 0);

getData([rounded]):输出最终裁剪的区域位置和大小数据(根据原始图像的自然大小

rounded 类型:Boolean 默认:false;设置true可以获取其所有数据;
返回的数据类型:Object;

  • x裁切框距离左边的距离
  • y裁切框距离顶部的距离
  • width裁切框的宽度
  • height裁切框的高度
  • rotate裁切框的旋转的角度
  • scaleX缩放图像的横坐标
  • scaleY缩放图像的纵坐标

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元素
    })

自己改成vue的语法就好

Demo

简单写了一个头像上传的组件,感兴趣的可以看一下:

基于cropperjs和vue3的头像上传组件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/408712.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaScript WebAPI

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录DOM 基本概念选中页面元素事件初识事件三要素操作元素获取/修改元素内容获取/修改元素属性获取/修改表单元素属性valuetype获取…

JS小知识,如何将 CSV 转换为 JSON 字符串

大家好&#xff0c;今天和大家聊一聊&#xff0c;在前端开发中&#xff0c;我们如何将 CSV 格式的内容转换成 JSON 字符串&#xff0c;这个需求在我们处理数据的业务需求中十分常见&#xff0c;你是如何处理的呢&#xff0c;如果你有更好的方法欢迎在评论区补充。一、使用 csvt…

手写防抖和节流函数

一、认识防抖debounce函数 我们用一副图来理解一下它的过程&#xff1a; 当事件触发时&#xff0c;相应的函数并不会立即触发&#xff0c;而是会等待一定的时间&#xff1b;当事件密集触发时&#xff0c;函数的触发会被频繁的推迟&#xff1b;只有等待了一段时间也没有事件触…

【前端进阶】-TypeScript高级类型 | 交叉类型、索引签名类型、映射类型

前言 博主主页&#x1f449;&#x1f3fb;蜡笔雏田学代码 专栏链接&#x1f449;&#x1f3fb;【TypeScript专栏】 上篇文章讲解了TypeScript部分高级类型 详细内容请阅读如下&#xff1a;&#x1f53d; 【前端进阶】-TypeScript高级类型 | 类的初始化、构造函数、继承、成员可…

nvm安装node,配置npm 、cnpm

nvm 是什么&#xff1f; nodejs的版本管理工具&#xff0c;为了解决node.js各种版本存在不兼容现象可以通过它安装和切换不同版本的node.js 重要&#xff1a;完全卸载本地node&#xff0c; 下载链接 卸载完成之后&#xff0c;点击nvm-setup.exe安装版&#xff0c;直接运行n…

不是吧,阿sir,还有人不会制作影院订票系统前端页面吗?(拿来就用)

影院订票系统前端页面&#x1f389;案例分析&#x1f389;详细设计✨座位数据与样式定义✨座位的事件处理及相关的代码✨监听与数据格式化✨电影信息展示&#x1f389;动态操作演示图&#x1f389;源码&#xff08;附图片素材&#xff09;引言&#xff1a;大家好&#xff0c;欢…

npm和cnpm下载安装及VUE的创建

npm和cnpm下载安装及VUE的创建 1. node.js下载 node.js官网&#xff1a; http://nodejs.cn/download/ 下载安装后cmd输入以下命令查看版本 2. 配置npm 打开node.js的安装目录&#xff0c;我这里是D:\nodejs&#xff0c;在此目录下创建两个文件夹”node_global“和”node_ca…

【申请加入New Bing遇到的问题:当前无法使用此页面,cn.bing.com 重定向次数过多】

目录一.前言二.问题描述三.解决方案解决方案1:解决方案2:四.总结一.前言 前面的文章我们详细的讲解了如何加入New Bing&#xff0c;之前我们直接加入还可以直接访问&#xff0c;但是现在访问过多就会出现当前无法使用此页面&#xff0c;cn.bing.com 重定向次数过多的问题&…

eslint常见报错及解决

eslint常见报错问题1&#xff1a;Component name "index" should always be multi-word问题2&#xff1a;Newline required at end of file but not found问题3&#xff1a;Strings must use singlequote问题4&#xff1a;Expected indentation of 2 spaces but foun…

json-server|0编码实现REST API

欢迎来到我的博客 &#x1f4d4;博主是一名大学在读本科生&#xff0c;主要学习方向是前端。 &#x1f36d;目前已经更新了【Vue】、【React–从基础到实战】、【TypeScript】等等系列专栏 &#x1f6e0;目前正在学习的是&#x1f525;React框架React框架React框架&#x1f525…

uniapp中的renderjs使用

需求是用openlayers在uniapp框架下做一个移动gis类的软件&#xff0c;选择用renderjs实现地图与dom的交互&#xff0c;一开始也是小白&#xff0c;通过百度资料以及一步步测试后掌握了renderjs的使用&#xff0c;以及地图功能的实现。 一、renderjs的作用是什么&#xff1f; r…

初始vue3

如今新vue项目首选用vue3 typescript vite pinia……模式。在使用Vue2时&#xff0c;使用的是选项式api进行vue项目的开发&#xff0c;vue3在这里做了重大的更新&#xff0c;vue3使用组合式api进行对项目实例化和构建。另外需要注意vue项目需要nodeJS环境的支持&#xff0c;…

LaTex(1):使用在线表格生成器工具生成LaTex表格

目录 0 在线工具 1 常用命令&#xff1a; 1.0 编辑表格 1.1 Table—set size可以改变表格大小&#xff1a; 1.2 合并表格和拆分表格&#xff1a; 1.3 生成latex代码与复制代码&#xff1a; 2 示例 0 在线工具 表格生成器网页&#xff1a;Create LaTeX tables online –…

BootStrap基本使用

目录 BootStrap框架 BootStrap特点 bootstrap的使用 布局容器 固定宽度 完整宽度 栅格网格系统 前言 列的形式 列组合和列偏移 列排序 列嵌套 排版 标题 段落 强调 对齐效果 列表 去点列表 内联列表 定义列表 代码 表格 表单标签 文本框和文本域 单…

【web服务】nginx为什么这么受企业欢迎?看完这边文章你就懂了

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是小鹏linux&#xff0c;运维领域创作者&#xff0c;阿里云ACE认证高级工程师&#x1f61c; &#x1f4dd; 个人主页&#xff1a;小鹏linux&#x1f525; &#x1f389; 支持我&#xff1a;点赞…

【ES6丨前端进阶基础 】ES6的关键字,新特性以及解构赋值

&#x1f482; 个人主页&#xff1a;Aic山鱼 个人社区&#xff1a;山鱼社区 &#x1f4ac; 如果文章对你有所帮助请点个&#x1f44d;吧!欢迎关注、点赞、收藏(一键三连)和订阅专目录 前言 什么是ecmascrpit 一&#xff0c;let关键字的特点 1.不能重复声明变量 2.块级作用…

Http协议之Content-Type理解

Content-Type&#xff0c;翻译过来就是”内容类型“&#xff0c;在互联网中就是”互联网媒体类型“。 在互联网中&#xff0c;两台计算机经常会传输数据&#xff0c;客户端会给服务器发数据&#xff0c;服务器也会给客户端发数据。数据的类型也是有很多种的&#xff0c;我们把所…

【微信小程序系列:四】前端利用wx.setStorageSync缓存设置有效时间

先言&#xff1a; 简单来说&#xff0c;就是利用缓存&#xff0c;进行有效期的保存&#xff0c;以此前端加以判断&#xff0c;在如登录状态过期&#xff0c;操作过期等场景使用&#xff0c;扩展性还蛮多的。 官方文档 实现&#xff1a; 原理&#xff1a;就是先设置一个缓存&…

项目实战 之 vue3 + vite + pinia

目录 一、创建项目 1. 安装vite 2. 创建项目 3. 安装过程 二、项目基本配置 1. 项目icon 2. 项目标题 3. 配置 jsconfig.json 4. 设置 .prettierrc 文件 5. 生成代码片段 01 - 网址 02 - 生成 03 - 配置 04 - 使用 三、项目目录 结构划分 1. assets 2. compo…

require.context()的用法详解

require.context&#xff08;&#xff09;的用法详解&#x1f334;require.context()的介绍&#x1f33a;用法一&#xff1a;在组件内引入多个组件&#x1f33c;用法二&#xff1a;在main.js中引入大量公共组件&#x1f342;用法三&#xff1a;使用插件注册全局组件&#x1f33…