vue3+vue-cropper图片裁剪个人使用记录

使用vite创建vue3+vite的项目

vue3项目可以通过这里创建,具体看这里就行了,开始 | Vite 官方中文文档 (vitejs.dev)
使用element-plus组件,安装 | Element Plus (element-plus.org)
vue-copper插件的使用方法和安装看这个网站,里面有这个插件的使用教程,也可以看我下面的用法。vue-cropper - npm (npmjs.com)vue-cropper - npm (npmjs.com) ,这里有对应的版本信息列表,vue-cropper - npm (npmjs.com)、对应的github地址GitHub - xyxiao001/vue-cropper: A simple picture clipping plugin for vue

关于vue-cropper的使用

1、安装插件(组件)

以下是我看官网的方法,然后的使用过程记录如下,首先安装这个插件,这里使用的是vue3,在官网也有使用方法的教程,
vue-cropper - npm (npmjs.com)vue-cropper - npm (npmjs.com)

npm install vue-cropper@next
import 'vue-cropper/dist/index.css'
import { VueCropper }  from "vue-cropper";

安装之后,我们可以看到,package.json中已经有对应的环境包了
在这里插入图片描述

2、vue-cropper插件的简单使用

项目的目录结构如下所示,安装完成后,就可以直接使用插件了,具体代码在截图后面,代码在后面,代码在截图后面,代码在截图后面。
在这里插入图片描述
在这里插入图片描述
我这里解决爆红的办法就是,建立一个ts文件,然后使用export deault导出,就可以解决爆红问题了,还不影响后续的打包语法爆红。
在这里插入图片描述
在看代码前,先看一下vue-cropper具有的大概属性配置,方便理解后面的代码官网的文档说明在这里vue-cropper - npm (npmjs.com),我把它截图下来了,图片来源于网络。
在这里插入图片描述
在这里插入图片描述

4、代码如下所示

ImgCorpper.vue的代码如下

<template>
  <div style="width: 100%; height: 100%;">
    <vueCropper style="width: 100%; height: 100%;" ref="cropper" 
    :img="option.img" 
    :outputSize="option.outputSize"
    :outputType="option.outputType" 
    :info="option.info" 
    :canScale="option.canScale" 
    :autoCrop="option.autoCrop"
    :autoCropWidth="option.autoCropWidth" 
    :autoCropHeight="option.autoCropHeight" 
    :fixedBox="option.fixedBox"
    :fixed="option.fixed" 
    :fixedNumber="option.fixedNumber" 
    :canMove="option.canMove" 
    :canMoveBox="option.canMoveBox"
    :original="option.original" 
    :centerBox="option.centerBox" 
    :infoTrue="option.infoTrue" 
    :full="option.full"
    :enlarge="option.enlarge" 
    :mode="option.mode">
  </vueCropper>
  </div>
</template>

<script setup lang="ts">
import 'vue-cropper/dist/index.css'
import { VueCropper }  from "vue-cropper";
import { reactive } from 'vue';

let option = reactive({
  img: '', // 裁剪图片的地址 url 地址, base64, blob
  outputSize: 1, // 裁剪生成图片的质量
  outputType: 'jpeg', // 裁剪生成图片的格式 jpeg, png, webp
  info: true, // 裁剪框的大小信息
  canScale: false, // 图片是否允许滚轮缩放
  autoCrop: true, // 是否默认生成截图框
  autoCropWidth: 150, // 默认生成截图框宽度
  autoCropHeight: 150, // 默认生成截图框高度
  fixedBox: false, // 固定截图框大小 不允许改变
  fixed: false, // 是否开启截图框宽高固定比例,这个如果设置为true,截图框会是固定比例缩放的,如果设置为false,则截图框的狂宽高比例就不固定了
  fixedNumber: [1, 1], // 截图框的宽高比例 [ 宽度 , 高度 ]
  canMove: true, // 上传图片是否可以移动
  canMoveBox: true, // 截图框能否拖动
  original: false, // 上传图片按照原始比例渲染
  centerBox: true, // 截图框是否被限制在图片里面
  infoTrue: true, // true 为展示真实输出图片宽高 false 展示看到的截图框宽高
  full: true, // 是否输出原图比例的截图
  enlarge: '1', // 图片根据截图框输出比例倍数
  mode: 'contain' // 图片默认渲染方式 contain , cover, 100px, 100% auto
})


</script>

<style scoped>

</style>

App.vue的代码如下所示:

<template>
  <div style="width: 600px; height: 500px;">
    <ImgCorpper/>
  </div>
</template>

<script setup lang="ts">
import ImgCorpper from './components/ImgCorpper.vue';
</script>

<style scoped>

</style>

gitee地址

vueCropper_project: vue3图片裁剪组件的使用(gitee.com)

运行之后可以得到这样的一个结果
在这里插入图片描述

3、结合文件上传使用vue-cropper实现图片裁剪

图片来源于网路
在这里插入图片描述
以下是实现的GIF图,具体代码在GIF图的后面,其实这里应该是使用dialog弹窗的形式,可能会好一点,我这里为了方便,就先不弹窗了。后续补充最完整的代码的时候再结合el-dialog来做
在这里插入图片描述

这里文件上传使用的是,element-plus的文件上传组件,Upload 上传 | Element Plus (element-plus.org),代码中的按钮也是使用的element-plus的按钮组件,Button 按钮 | Element Plus (element-plus.org),具体用法可以参考官网,这里不过多描述了。
这里注意了,如果在使用element plus的文件上传组件爆红的话,虽然不影响运行,但是打包会有问题,具体看这里有说明,vite+ts+elementplus运行正常打包报错_m0_62317155的博客-CSDN博客,如下图所示
在这里插入图片描述
在这里插入图片描述

5、代码如下所示

代码的目录结构如下所示
在这里插入图片描述

VueCropper.ts的代码如下所示

import 'vue-cropper/dist/index.css'
import { VueCropper }  from "vue-cropper";
export default VueCropper;

ImgCorpper.vue 代码如下所示

<template>
  <div style="width: 100%; height: 100%;">
    <el-row style="width: 100%; height: 100%;">
      <vueCropper style="width: 100%; height: 100%;" ref="cropper" :img="option.img" :outputSize="option.outputSize"
        :outputType="option.outputType" :info="option.info" :canScale="option.canScale" :autoCrop="option.autoCrop"
        :autoCropWidth="option.autoCropWidth" :autoCropHeight="option.autoCropHeight" :fixedBox="option.fixedBox"
        :fixed="option.fixed" :fixedNumber="option.fixedNumber" :canMove="option.canMove" :canMoveBox="option.canMoveBox"
        :original="option.original" :centerBox="option.centerBox" :infoTrue="option.infoTrue" :full="option.full"
        :enlarge="option.enlarge" :mode="option.mode">
      </vueCropper>
    </el-row>
    <el-row style="width: 100%; height: 60px; margin-top: 10px;">
      <!-- 注意这里的action=""和 :auto-upload="false",我把自动上传关了,免得点击上传图片的时候发送一次请求 -->
      <el-upload v-model:file-list="fileList" action="" :auto-upload="false" :show-file-list="false"
        :on-change="handleChange">
        <el-button type="primary">点击上传图片</el-button>
      </el-upload>
      <el-button type="primary" plain @click="rotateLeft">《=向左旋转图片</el-button>
      <el-button type="primary" plain @click="rotateRight">向有旋转图片=》</el-button>
      <el-button type="primary" @click="getCropDataBase64">获取截取的图片</el-button>
    </el-row>

    <hr>
    <div>
      展示截图的图片
    </div>
    <div style="width: 300px; height: 500px;">
      <!-- 若图片只设置宽度,可以保持等比例展示图片 -->
      <img :src="imgUrl" style="width: 100%;">
    </div>
  </div>
</template>

<script setup lang="ts">
import vueCropper from './VueCropper.ts'
import { ref, reactive } from 'vue';
// import { ElMessage, ElMessageBox } from 'element-plus'
import type { UploadProps, UploadFile } from 'element-plus'

const cropper = ref()
let option = reactive({
  img: '', // 裁剪图片的地址 url 地址, base64, blob
  outputSize: 1, // 裁剪生成图片的质量
  outputType: 'jpeg', // 裁剪生成图片的格式 jpeg, png, webp
  info: true, // 裁剪框的大小信息
  canScale: false, // 图片是否允许滚轮缩放
  autoCrop: true, // 是否默认生成截图框
  autoCropWidth: 150, // 默认生成截图框宽度
  autoCropHeight: 150, // 默认生成截图框高度
  fixedBox: false, // 固定截图框大小 不允许改变
  fixed: false, // 是否开启截图框宽高固定比例,这个如果设置为true,截图框会是固定比例缩放的,如果设置为false,则截图框的狂宽高比例就不固定了
  fixedNumber: [1, 1], // 截图框的宽高比例 [ 宽度 , 高度 ]
  canMove: true, // 上传图片是否可以移动
  canMoveBox: true, // 截图框能否拖动
  original: false, // 上传图片按照原始比例渲染
  centerBox: true, // 截图框是否被限制在图片里面
  infoTrue: true, // true 为展示真实输出图片宽高 false 展示看到的截图框宽高
  full: true, // 是否输出原图比例的截图
  enlarge: '1', // 图片根据截图框输出比例倍数
  mode: 'contain' // 图片默认渲染方式 contain , cover, 100px, 100% auto
})

// 向左旋转图片
const rotateLeft = () => {
  // 这个默认是旋转90度的,官网有说明
  // 后面会完善不要让这个一下子旋转90度的代码
  cropper.value.rotateLeft()
}

// 向右旋转
const rotateRight = () => {
  // 这个默认也是旋转90度的,官网有说明
  // 后面会完善不要让这个一下子旋转90度的代码
  cropper.value.rotateRight()
}

// 获取图片
const getCropDataBase64 = () => {
  // 这个是获取base64的图片
  cropper.value.getCropData((data: any) => {
    // do something
    // 如这里,可以获取上传base64位的图片给服务器
    // 也可以将base64位的图片转化为file文件,然后通过form表单的形式提交给后端,让后端返回一个图片的访问地址等
    // 这里就简单把截取到的图片展示一下吧,这里就暂时不上传给后端了
    imgUrl.value = data
  })
}

const imgUrl = ref('')

const fileList = ref([])
// el-upload的change事件,具体看element-plus的官网
const handleChange: UploadProps['onChange'] = (
  uploadFile: UploadFile
) => {
  // URL.createObjectURL(uploadFile.raw!),将图片变成blob的数据,类似于blob:http://127.0.0.1:5173/dbaf505d-df43-4448-809d-8daadf3e883c
  option.img = URL.createObjectURL(uploadFile.raw!)
}

</script>

<style scoped></style>

App.vue的代码如下所示

<template>
  <div style="width: 600px; height: 500px;">
    <ImgCorpper/>
  </div>
</template>

<script setup lang="ts">
import ImgCorpper from './components/ImgCorpper.vue';
</script>

<style scoped>

</style>

未完待续,有空补上这个插件的实时截图预览效果,这个官网有说明。有兴趣的小伙伴可以自己去试试。后面可能会先优先考虑补充如何让图片旋转角度不要一下子超过90度。

  • 21
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值