vue中实现图片裁剪

news/2024/9/18 15:30:59/ 标签: vue.js, 前端, javascript

在现代Web应用中,图片处理是一个常见的需求。本文将介绍如何使用Vue.js结合Cropper.js实现一个简单的图片裁剪功能。以下是实现该功能的完整代码。

代码实现

<template><div class="c-copper-container" :class="{'wd260' : type == 'articlesubmit'}"><div class="c-copper-box"><div class="c-image-box"><img :src="copperImgUrl" id="image" alt="暂无图片"></div><div class="c-preview-box"><div class="img-preview"><div class="title">预览</div><div class="preview"><img :src="copperImgUrl" alt="暂无图片"></div></div><div class="img-upload-btn"><el-button icon="cs-format-image" size="mini" plain>上传图片</el-button><input type="file" accept="image/png,image/jpeg,image/jpg" id="imgFile" @change="getFile"></div></div></div><div class="c-btn-group"><el-button type="info" plain @click="cancel">取消</el-button><el-button type="primary" @click="getCropperImg">确定</el-button></div></div>
</template>
代码解析
  1. <div class="c-copper-container" :class="{'wd260' : type == 'articlesubmit'}">

    • 定义了一个容器,并根据 type 属性动态添加 wd260 类。
  2. <div class="c-copper-box">

    • 包含图片裁剪和预览的主要布局。
  3. <div class="c-image-box">

    • 裁剪图片显示区域。
  4. <img :src="copperImgUrl" id="image" alt="暂无图片">

    • 绑定了一个图片标签,用于显示裁剪的图片。
  5. <div class="c-preview-box">

    • 图片预览区域。
  6. <div class="img-preview">

    • 包含预览标题和预览图片。
  7. <el-button icon="cs-format-image" size="mini" plain>上传图片</el-button>

    • 上传图片按钮。
  8. <input type="file" accept="image/png,image/jpeg,image/jpg" id="imgFile" @change="getFile">

    • 文件输入框,监听文件变化事件 getFile
  9. <el-button type="info" plain @click="cancel">取消</el-button>

    • 取消按钮,触发 cancel 方法。
  10. <el-button type="primary" @click="getCropperImg">确定</el-button>

    • 确定按钮,触发 getCropperImg 方法。

JavaScript 部分

javascript"><script>import { dataURItoBlob } from '@/utils'export default {name: 'CropperImage',data () {return {copperImgUrl: '', // 被剪裁的图片地址option: {viewMode: 1, // 裁剪框只能图片内部移动dragMode: 'move', // 裁剪框只可以移动,不可以新建aspectRatio: 1, // 裁剪框比例preview: '.preview', // 预览的dom节点checkCrossOrigin: false, // 不检查跨域图像movable: false, // 设置图片可不移动rotatable: false, // 设置图片不可旋转scalable: false, // 设置图片不可缩放zoomable: false, // 设置图片不可放大zoomOnTouch: false, // 设置图片不可被拖动触摸放大toggleDragModeOnDblclick: true, // 点击两次时可以在“crop”和“move”之间切换拖拽模式minCropBoxWidth: '5', // 裁剪层最小宽度minCropBoxHeight: '5' // 裁剪层最小高度}}},props: {cropperOption: {type: Object,default: () => {return null}},fileSize: {type: Number,default: 0.8},fileType: {type: String,default: 'jpeg'},imageFile: {},sizeNum:{type: Number,default: 0},type:{type: String,default: ''}},watch: {imageFile (file) {this.fileHandle(file)}},methods: {initCropperModel () {if (this.cropperOption) {for (let key in this.option) {this.option[key] = this.cropperOption[key] || this.option[key]}}let $image = document.getElementById('image')this.cropper = new Cropper($image, this.option)},getFile (e) {let file = e.target.files[0]let _sizeNum = this.sizeNumif(_sizeNum){const isLtSize = file.size / 1024 / 1024 < _sizeNumif (!isLtSize) {this.$message({message: this.type == 'articlesubmit' ? `图片大小不能超过 ${_sizeNum}M!` :  `图片大小不能超过 ${_sizeNum * 1000}kb!`,type: 'error'})e.target.value = ''return false}}this.fileHandle(file)},fileHandle (file) {if (!file) return if (!window.FileReader) return let vm = thislet reader = new FileReader()reader.readAsDataURL(file)reader.onloadend = function () {vm.copperImgUrl = this.resultvm.resetCropperImg()}},resetCropperImg () {this.cropper.reset()this.cropper.replace(this.copperImgUrl)},getCropperImg () {let canvas = this.cropper.getCroppedCanvas();if (this.fileType === 'image/png') {let ctx = canvas.getContext('2d');ctx.fillStyle = "rgba(0,0,0,0)"; ctx.fillRect(0, 0, canvas.width, canvas.height);}let newImageData = canvas.toDataURL('image/png');let blob = dataURItoBlob(newImageData);let formData = new FormData();formData.append('icon', blob);this.$emit('cropped', newImageData, formData);},cancel () {this.$emit('cancel')}},created () {this.fileHandle(this.imageFile)},mounted () {this.initCropperModel()},beforeDestroy () {this.copperImgUrl = ''this.cropper.destroy()}}
</script>
代码解析
  1. data ():

    • 定义组件的数据属性,包括图片URL和裁剪器的配置项。
  2. props:

    • 定义父组件传入的属性,包括裁剪配置、文件大小和类型等。
  3. watch:

    • 监听 imageFile 的变化,当文件变化时调用 fileHandle 方法。
  4. methods:

    • initCropperModel ():初始化 Cropper.js 实例。
    • getFile (e):获取上传的文件并处理。
    • fileHandle (file):处理上传的文件,将文件转换为Base64格式。
    • resetCropperImg ():重置裁剪器的图片。
    • getCropperImg ():获取裁剪后的图片,并将其转换为Blob格式。
    • cancel ():取消操作。
  5. created ()

    • 在组件创建时处理初始图片文件。
  6. mounted ()

    • 在组件挂载时初始化裁剪器。
  7. beforeDestroy ()

    • 在组件销毁前清理裁剪器实例。

样式部分

<style scoped lang="stylus" rel="stylesheet">.c-copper-container {width 450pxfont-size 12pxmargin-top 20px&.wd260{width 260px.img-upload-btn .el-button{padding 7px 5px}.c-image-box {width 188pxheight 188px& img {max-width 100%}>>> .cropper-bg{width 200px !important}}.c-preview-box {width 80px.img-preview {padding 5px 8pxheight 100px}.preview {width 60pxheight 60px}}}.c-copper-box {display flex}.c-image-box {width 250pxheight 250pxmargin-right 20pxbackground #868686& img {max-width 100%}}.c-preview-box {width 180pxtext-align center.img-preview {width 100%padding 10px 15pxheight 200pxbox-sizing border-boxborder 1px solid #e8e8e8background #fafafa}.title {padding-bottom 5px}.preview {width 148pxheight 148pxoverflow hiddenbackground-color #fffborder 1px solid #e8e8e8display inline-block}}.img-upload-btn {position relativemargin-top 18px&:hover .el-button {color #168FCAborder-color #168FCAtransition all .1s}& /deep/ i, & /deep/ span {display inline-blockvertical-align middle}.el-button {width 100%border-radius 0}#imgFile {position absolutewidth 100%height 100%top 0left 0opacity 0cursor pointer}}.c-btn-group {padding-top 20pxtext-align center.el-button {width 100px}}}
</style>
代码解析
  1. 定义了组件的样式,包括容器宽度、字体大小等。

  2. 使用了 scoped 属性,确保样式仅应用于当前组件。

  3. 采用了Stylus语法编写样式,提高了代码的可读性和易维护性。

总结

通过以上代码,我们实现了一个基于Vue.js和Cropper.js的图片裁剪组件,用户可以上传图片并进行裁剪操作,最终获取裁剪后的图片数据。这个组件可以方便地集成到Vue.js应用中,为用户提供了良好的图片处理体验。


http://www.ppmy.cn/news/1517199.html

相关文章

零知识证明-非对称加解密算法(三)

前言 非对称加解密算法 &#xff0c;就有对称加解密算法 1:对称算法 定义 对称算法&#xff0c;加解密双方使用一个密钥。即加密秘钥和解密秘钥相同。 对称加密又分为&#xff1a;分组加密和流加密 分组加密 分组加密是每次只能处理特定长度的一块数据的一类密码算法&#xff0…

WPF 手撸插件 五 消息总线

虽然暂时不知道该如何将消息总线集成到插件系统中&#xff0c;但是让我先学习起来吧&#xff0c;本文主要来说说我最近学习的Reface.EventBus Reface.EventBus有两个版本&#xff0c;分别支持.Net Framework和 .Net Core。 我们这里先说支持.Net Framework的版本&#xff0c;先…

【问题记录】mysql报错 ,mysql2 和 mysql 5.

错误2 和 错误5 都是由于注册表有问题&#xff1a; 由于我之前安装过MySQL&#xff0c;导致之前的配置没有删除。 解决&#xff1a; 搜索打开注册表编辑器&#xff1a; 注册表中找到MySQL: 修改路径&#xff1a; "D:\develop\mysql-8.0.39-winx64\bin\mysqld&quo…

边缘物联网平台AIoTedge推荐

AIoTedge是一个创新的智能边缘计算平台&#xff0c;它通过边云协同的架构设计&#xff0c;实现了多点部署和分布式计算&#xff0c;提高了数据处理的速度和效率&#xff0c;同时确保了数据的安全性和隐私性。平台具备强大的分布式AIoT处理能力&#xff0c;适用于多种场景&#…

【中学教资-信息技术】图像/音频/视频文件大小的计算

图像/音频/视频文件大小的计算 1 图像文件2 音频文件3 视频文件4 例题5 总结 视频讲解&#xff1a;音频文件大小/视频文件大小计算-失舵之舟 1 图像文件 压缩比原始大小/被压缩之后大小 颜色深度&#xff1a;指图像中每个像素所占的二进制位数&#xff08;bit&#xff09; n位…

linux查看系统安装时间命令,找出Linux操作系统(OS)安装日期和时间

你可能想知道你的计算机上何时安装了Linux操作系统,即OS的安装日期和时间,使用tune2fs、dumpe2fs、ls、basesystem、setup、setuptool命令能出来结果。请注意,如果你从模板安装了操作系统,那么它将显示模板生成日期,而不是实际操作系统安装日期。 方法1:如何使用tune2fs…

Solidity入门——receive()和fallback()以及交易数据的简单介绍和运用

如何运用payable和transfer发送交易 在以太坊智能合约中&#xff0c;payable关键字和.transfer()方法它们在智能合约中是如何被使用的。 payable关键字 payable关键字用于声明合约或函数可以接受以太币。当你在一个函数或合约前面加上payable修饰符时&#xff0c;你允许该函…

java程序优化

Java程序的性能优化是一个复杂但非常重要的过程&#xff0c;它涉及多个方面。首先&#xff0c;我们需要识别性能瓶颈的具体位置&#xff0c;这通常可以通过性能分析工具&#xff08;如JProfiler, VisualVM等&#xff09;来完成。以下是一些通用的优化策略&#xff1a; 代码层面…

软件测试学习笔记丨Pytest配置文件

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/31774 一、Pytest配置文件 1.1 pytest.ini的定义 pytest.ini是pytest的配置文件&#xff1b;可以修改pytest的默认行为&#xff1b;不能使用任何中文符号&#xff0c;包括汉字、空格、引号、…

Kafka分布式集群部署实战:跨越理论,直击生产环境部署难题与解决方案,性能调优、监控与管理策略大揭秘,轻松上手分布式消息中间件

本文介绍kafka的集群如何部署和安装&#xff0c;1-4章理论知识&#xff0c;第5章详解集群的部署&#xff0c;部署Kafka之前需要先部署好分布式的Zookeeper&#xff0c;不喜欢理论的可以直接看第5章&#xff0c;欢迎大家一起探讨技术&#xff01; Zookeeper集群部署参考文章&…

JavaScript 数据结构 ==== 二叉树

目录 二叉树 结构 二叉树和二叉搜索树介绍 1.创建树 2.插入一个键 3.树的遍历 中序排序 先序遍历 后序遍历 4.搜索树中的值 5.删除节点 二叉树 在计算机科学中&#xff0c;二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”&#xff08;left subtre…

【数据结构】优先级队列 — 堆

文章目录 前言1. 优先级队列1.1 概念1.2 特性 2. 堆2.1 概念2.2 存储方式 3. 堆的模拟实现3.1 堆的创建3.2 堆的插入3.3 堆的删除 4. PriorityQueue4.1 注意事项4.2 构造器介绍4.3 常用方法介绍 5. 经典题型6. 结语 前言 我们之前学习过队列&#xff0c;它是遵循先进先出原则的…

全国教育大模型完成备案已达40个

全国教育大模型完成备案已达40个 近期&#xff0c;教育行业正迎来一场由人工智能引领的革新风暴&#xff0c;近日&#xff0c;职业培训机构粉笔上线了AI老师“粉笔头”&#xff0c;被称为首个职教行业的垂直大模型。据最新统计&#xff0c;截至今年6月&#xff0c;我国教育领域…

中资优配:国家推动大规模投资更新能源重点领域设备

8月21日&#xff0c;国家开展变革委、国家动力局联合印发《动力要点领域大规模设备更新施行方案》&#xff08;以下简称《方案》&#xff09;&#xff0c;清晰将要点推进施行煤电机组节能改造、供热改造和灵活性改造“三改联动”&#xff0c;输配电、风电、光伏、水电等领域完成…

mac Let‘s Encrypt 免费SSL证书申请

1、安装certbot brew install certbot 2、执行命令 sudo certbot certonly -d "iot.xxx.cn" --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory 3、域名解析配置 4、按Enter继续 5、生成证书 fullchain.pem 是证书文…

GPS北斗授时服务器(网络时钟系统)助力金融领域

GPS北斗授时服务器&#xff08;网络时钟系统&#xff09;助力金融领域 GPS北斗授时服务器&#xff08;网络时钟系统&#xff09;助力金融领域 摘 要:首先对计算机网络时间同步相关技术进行了介绍,然后阐述了时间同步技术在现代计算机网络中的应用与发展,最后指出时间同步网络在…

【奇某信-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

嵌入式机器视觉的流水线分拣机器人:OpenCV、 FreeRTOS、 TensorFlow(代码详解)

一、项目概述 在现代自动化生产中&#xff0c;分拣机器人作为提高生产效率和准确度的重要工具&#xff0c;正逐渐成为工业流水线的核心组成部分。本项目旨在设计一款基于嵌入式机器视觉的流水线分拣机器人&#xff0c;通过高效的图像处理与实时控制技术&#xff0c;实现对物品…

【XR】SDK的接口规划与设计

【XR】SDK的接口规划与设计 1. **模块化与扩展性****设计思路****设计理由** 2. **状态管理的清晰性****设计思路****设计理由** 3. **用户体验与易用性****设计思路****设计理由** 4. **稳定性和容错性****设计思路****设计理由** 5. **性能优化与实时性****设计思路****设计理…

C++中 inline 的含义是什么?

在C中&#xff0c;inline是一个关键字&#xff0c;它向编译器发出一个请求&#xff08;注意&#xff0c;这是一个请求而不是命令&#xff09;&#xff0c;请求编译器尝试将函数的调用替换为函数体本身的代码。这样做的目的是减少函数调用的开销&#xff0c;特别是对于那些体积小…