Vue3+cropperjs 实现图片裁剪功能

简介: Vue3+cropperjs 实现图片裁剪功能

安装cropperjs

npm install cropperjs --save
或者
yarn add cropperjs

封装一个cropperImg组件

//cropperImg.vue
<template>
  <div>
    <!--使用ref属性给图片元素命名为imageRef-->
    <img ref="imageRef" :src="imageSrc" alt="image" >
    <button @click="cropImage">裁剪图片</button>
  </div>
</template>
<script setup>
import {ref, onMounted, onBeforeUnmount} from "vue";
  import Cropper from 'cropperjs';
  import "cropperjs/dist/cropper.css";
  const props = defineProps({
    //图片地址
    imageSrc: {
      type: String,
      required: true
    },
    //aspectRatio:置裁剪框为固定的宽高比
    aspectRatio: {
      type: Number,
      default: 1,
    },
    //viewMode: 视图控制
    viewMode: {
      type: Number,
      default: 1,
    },
    //autoCropArea: 设置裁剪区域占图片的大小 值为 0-1 默认 0.8 表示 80%的区域
    autoCropArea: {
      type: Number,
      default: 1,
    },
  })
  //绑定图片的dom对象
  const imageRef = ref(null)
  let cropper = null;
  //使用Cropper构造函数创建裁剪器实例,并将图片元素和一些裁剪选项传入
  onMounted(() => {
    cropper = new Cropper(imageRef.value, {
      aspectRatio: props.aspectRatio,
      viewMode: props.viewMode,
      autoCropArea: props.autoCropArea,
    });
  });
  //定义方法
  const emit = defineEmits(['updateImageSrc'])
  //在cropImage函数中,获取裁剪后的图片数据URL,并使用emit方法触发updateImageSrc事件,
  // 将裁剪后的图片数据URL传递给父组件。
  const cropImage = () => {
    const canvas = cropper.getCroppedCanvas();
    const croppedImage = canvas.toDataURL();
    emit('updateImageSrc', croppedImage);
  }
  //销毁
  onBeforeUnmount(()=>{
    cropper.destroy()
  })
</script>


在以上代码中,我们使用props属性,用于传入裁剪器的配置项和需要裁剪的图片地址。在onMounted生命周期钩子中,使用传入的props创建裁剪器实例,并将图片元素和一些裁剪选项传入。


在cropImage函数中,获取裁剪后的图片数据URL,并使用emit方法触发updateImageSrc事件,将裁剪后的图片数据URL传递给父组件。


使用

<template>
  <cropper-img :imageSrc="imageSrc" @updateImageSrc="updateImageSrc" />
  <div>
    <p>预览图片</p>
    <img :src="imageNew" alt="">
  </div>
</template>
<script setup>
import {reactive, ref,} from "vue";
import CropperImg from "../../components/cropperImg.vue";
const imageSrc = ref('https://cdn.tehub.com/uploads/bCChGvhsbU/u/avatar/a2885f74-5400-48a1-fa93-a0bbdb7bddd6.jpeg?imageView2/1/w/200/h/200/q/100')
//定义一个imageNew变量来接收裁剪之后的图片
const imageNew = ref()
//点击裁剪按钮
const updateImageSrc = (updateImageSrc) => {
  imageNew.value = updateImageSrc
}
</script>

cropperjs配置项

cropperjs文档:cropperjs/README.md at main · fengyuanchen/cropperjs · GitHub


这里列出几个常用的配置项:


viewMode 视图控制


0 无限制


1 限制裁剪框不能超出图片的范围


2 限制裁剪框不能超出图片的范围 且图片填充模式为 cover 最长边填充


3 限制裁剪框不能超出图片的范围 且图片填充模式为 contain 最短边填充


dragMode 拖拽图片模式


crop 形成新的裁剪框

move 图片可移动

none 什么也没有

initialAspectRatio 裁剪框宽高比的初始值 默认与图片宽高比相同 只有在aspectRatio没有设置的情况下可用

aspectRatio 设置裁剪框为固定的宽高比

data 之前存储的裁剪后的数据 在初始化时会自动设置 只有在autoCrop设置为true时可用

preview 预览 设置一个区域容器预览裁剪后的结果

responsive 在窗口尺寸调整后 进行响应式的重渲染 默认true

restore 在窗口尺寸调整后 恢复被裁剪的区域 默认true

checkCrossOrigin 检查图片是否跨域 默认true 如果是 会在被复制的图片元素上加上属性crossOrigin 并且在src上加上一个时间戳 避免重加载图片时因为浏览器缓存而加载错误

checkOrientation 检查图片的方向信息(仅JPEG图片有)默认true 在旋转图片时会对图片方向值做一些处理 以解决IOS设备上的一些问题

modal 是否显示图片和裁剪框之间的黑色蒙版 默认true

guides 是否显示裁剪框的虚线 默认true

center 是否显示裁剪框中间的 ‘+’ 指示器 默认true

highlight 是否显示裁剪框上面的白色蒙版 (很淡)默认true

background 是否在容器内显示网格状的背景 默认true

autoCrop 允许初始化时自动的裁剪图片 配合 data 使用 默认true

autoCropArea 设置裁剪区域占图片的大小 值为 0-1 默认 0.8 表示 80%的区域

movable 是否可以移动图片 默认true

rotatable 是否可以旋转图片 默认true

scalable 是否可以缩放图片(可以改变长宽) 默认true

zoomable 是否可以缩放图片(改变焦距) 默认true

zoomOnTouch 是否可以通过拖拽触摸缩放图片 默认true

zoomOnWheel 是否可以通过鼠标滚轮缩放图片 默认true

wheelZoomRatio 设置鼠标滚轮缩放的灵敏度 默认 0.1

cropBoxMovable 是否可以拖拽裁剪框 默认true

cropBoxResizable 是否可以改变裁剪框的尺寸 默认true

toggleDragModeOnDblclick 是否可以通过双击切换拖拽图片模式(move和crop)默认true 当拖拽图片模式为none时不可切换 该设置必须浏览器支持双击事件

minContainerWidth(200)、minContainerHeight(100)、minCanvasWidth(0)、minCanvasHeight(0)、minCropBoxWidth(0)、minCropBoxHeight(0) 容器、图片、裁剪框的 最小宽高 括号内为默认值 注意 裁剪框的最小高宽是相对与页面而言的 并非相对图片


相关文章
|
7月前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
953 139
|
12月前
|
缓存 JavaScript PHP
斩获开发者口碑!SnowAdmin:基于 Vue3 的高颜值后台管理系统,3 步极速上手!
SnowAdmin 是一款基于 Vue3/TypeScript/Arco Design 的开源后台管理框架,以“清新优雅、开箱即用”为核心设计理念。提供角色权限精细化管理、多主题与暗黑模式切换、动态路由与页面缓存等功能,支持代码规范自动化校验及丰富组件库。通过模块化设计与前沿技术栈(Vite5/Pinia),显著提升开发效率,适合团队协作与长期维护。项目地址:[GitHub](https://github.com/WANG-Fan0912/SnowAdmin)。
1299 5
|
7月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
525 1
|
8月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
871 11
|
7月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
592 0
|
9月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
913 1
|
9月前
|
缓存 JavaScript UED
除了循环引用,Vue3还有哪些常见的性能优化技巧?
除了循环引用,Vue3还有哪些常见的性能优化技巧?
475 0
|
10月前
|
JavaScript
vue3循环引用自已实现
当渲染大量数据列表时,使用虚拟列表只渲染可视区域的内容,显著减少 DOM 节点数量。
220 0
|
12月前
|
JavaScript API 容器
Vue 3 中的 nextTick 使用详解与实战案例
Vue 3 中的 nextTick 使用详解与实战案例 在 Vue 3 的日常开发中,我们经常需要在数据变化后等待 DOM 更新完成再执行某些操作。此时,nextTick 就成了一个不可或缺的工具。本文将介绍 nextTick 的基本用法,并通过三个实战案例,展示它在表单验证、弹窗动画、自动聚焦等场景中的实际应用。
1138 17
|
12月前
|
JavaScript 前端开发 API
Vue 2 与 Vue 3 的区别:深度对比与迁移指南
Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架,在过去的几年里,Vue 2 一直是前端开发中的重要工具。而 Vue 3 作为其升级版本,带来了许多显著的改进和新特性。在本文中,我们将深入比较 Vue 2 和 Vue 3 的主要区别,帮助开发者更好地理解这两个版本之间的变化,并提供迁移建议。 1. Vue 3 的新特性概述 Vue 3 引入了许多新特性,使得开发体验更加流畅、灵活。以下是 Vue 3 的一些关键改进: 1.1 Composition API Composition API 是 Vue 3 的核心新特性之一。它改变了 Vue 组件的代码结构,使得逻辑组
2301 0

热门文章

最新文章