vue-cropper裁剪图片 vue

news2024/9/23 13:25:32

效果图

1.配置环境

npm install vue-cropper

2.代码

<template>
  <div class="cropper-content">
    <div class="cropper-box">
      <div class="cropper">
        <vue-cropper 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" :fixed="option.fixed"
          :fixedNumber="option.fixedNumber" :full="option.full" :fixedBox="option.fixedBox" :canMove="option.canMove"
          :canMoveBox="option.canMoveBox" :original="option.original" :centerBox="option.centerBox"
          :height="option.height" :infoTrue="option.infoTrue" :maxImgSize="option.maxImgSize" :enlarge="option.enlarge"
          :mode="option.mode" @realTime="realTime" @imgLoad="imgLoad">
        </vue-cropper>
      </div>
      <!--底部操作工具按钮-->
      <div class="footer-btn">
        <div class="scope-btn">
          <label class="btn" for="uploads">选择图片</label>
          <input type="file" id="uploads" style="position:absolute; clip:rect(0 0 0 0);"
            accept="image/png, image/jpeg, image/gif, image/jpg" @change="selectImg($event)">
          <el-button size="mini" type="danger" plain icon="el-icon-zoom-in" @click="changeScale(1)">放大</el-button>
          <el-button size="mini" type="danger" plain icon="el-icon-zoom-out" @click="changeScale(-1)">缩小</el-button>
          <el-button size="mini" type="danger" plain @click="rotateLeft">↺ 左旋转</el-button>
          <el-button size="mini" type="danger" plain @click="rotateRight">↻ 右旋转</el-button>
        </div>
        <div class="upload-btn">
          <el-button size="mini" type="success" @click="uploadImg('blob')">裁剪完毕 <i class="el-icon-upload"></i>
          </el-button>
        </div>
      </div>
    </div>
    <!--预览效果图-->
    <div class="show-preview">
      <div :style="previews.div" class="preview">
        <img :src="previews.url" :style="previews.img">
      </div>
    </div>
  </div>
</template>
 
<script>
  import {
    VueCropper
  } from 'vue-cropper'
  export default {
    name: "CropperImage",
    components: {
      VueCropper
    },
    props: ['Name'],
    data() {
      return {
        name: this.Name,
        previews: {},
        option: {
          img: '', //裁剪图片的地址
          outputSize: 1, //裁剪生成图片的质量(可选0.1 - 1)
          outputType: 'jpeg', //裁剪生成图片的格式(jpeg || png || webp)
          info: true, //图片大小信息
          canScale: true, //图片是否允许滚轮缩放
          autoCrop: true, //是否默认生成截图框
          autoCropWidth: 160, //默认生成截图框宽度
          autoCropHeight: 90, //默认生成截图框高度
          fixed: true, //是否开启截图框宽高固定比例
          fixedNumber: [1.77777, 1], //截图框的宽高比例
          full: false, //false按原比例裁切图片,不失真
          fixedBox: true, //固定截图框大小,不允许改变
          canMove: false, //上传图片是否可以移动
          canMoveBox: true, //截图框能否拖动
          original: false, //上传图片按照原始比例渲染
          centerBox: false, //截图框是否被限制在图片里面
          height: true, //是否按照设备的dpr 输出等比例图片
          infoTrue: false, //true为展示真实输出图片宽高,false展示看到的截图框宽高
          maxImgSize: 3000, //限制图片最大宽度和高度
          enlarge: 1, //图片根据截图框输出比例倍数
          mode: '100%' //图片默认渲染方式
        }
      };
    },
    methods: {
      //初始化函数
      imgLoad(msg) {
        console.log("工具初始化函数=====" + msg)
      },
      //图片缩放
      changeScale(num) {
        num = num || 1
        this.$refs.cropper.changeScale(num)
      },
      //向左旋转
      rotateLeft() {
        this.$refs.cropper.rotateLeft()
      },
      //向右旋转
      rotateRight() {
        this.$refs.cropper.rotateRight()
      },
      //实时预览函数
      realTime(data) {
        // console.log('实时预览图片的data:' + data);
        // console.log(data);
        this.previews = data
      },
      //选择图片
      selectImg(e) {
        let file = e.target.files[0]
        if (!/\.(jpg|jpeg|png|JPG|PNG)$/.test(e.target.value)) {
          this.$message({
            message: '图片类型要求:jpeg、jpg、png',
            type: "error"
          });
          return false
        }
        //转化为blob
        let reader = new FileReader()
        reader.onload = (e) => {
          let data
          if (typeof e.target.result === 'object') {
            data = window.URL.createObjectURL(new Blob([e.target.result]))
          } else {
            data = e.target.result
          }
          this.option.img = data //将创建的blob图片链接保存到数据里面,跟正常图片一样
        }
        //转化为base64
        reader.readAsDataURL(file)
      },
      //上传图片
      uploadImg(type) {
        let _this = this;
        if (type === 'blob') {
          //获取截图的blob数据
          this.$refs.cropper.getCropBlob((file) => {//得到裁剪以后的图片文件,方便使用
            this.$refs.cropper.getCropData((base64) => {//得到裁剪以后的base64图片,方便使用
            alert('裁剪完毕,请看代码里面的uploadImg函数里面教你的使用方法,懒狗记得看')            
            //如果你想使用file二进制文件上传!那么请用11111111里面的代码,尤其是formData这样的上传格式,否则上传失败
            //1111111111111111111111111111111111111111111111111111111111111111111111111
            // let formData = new FormData();
            // formData.append('file',data,"DX.jpg")
            // let {data: res} = await _this.$http.post('/api/file/imgUpload', formData)
            //1111111111111111111111111111111111111111111111111111111111111111111111111111
            
            //如果你用base64那用请用22222222
            //2222222222222222222222222222222222222222222222222222222222222222222
 
              //就正常post上传就行,这样都不会啊
 
            //22222222222222222222222222222222222222222222222222222222222222222
            })
          })
        }
      },
    },
  }
</script>
 
<style scoped lang="less">
  .cropper-content {
    display: flex;
    display: -webkit-flex;
    justify-content: flex-end;
 
    .cropper-box {
      flex: 1;
      width: 100%;
 
      .cropper {
        width: auto;
        height: 300px;
      }
    }
 
    .show-preview {
      flex: 1;
      -webkit-flex: 1;
      display: flex;
      display: -webkit-flex;
      justify-content: center;
 
      .preview {
        overflow: hidden;
        border: 1px solid #67c23a;
        background: #cccccc;
      }
    }
  }
 
  .footer-btn {
    margin-top: 30px;
    display: flex;
    display: -webkit-flex;
    justify-content: flex-end;
 
    .scope-btn {
      display: flex;
      display: -webkit-flex;
      justify-content: space-between;
      padding-right: 10px;
    }
 
    .upload-btn {
      flex: 1;
      -webkit-flex: 1;
      display: flex;
      display: -webkit-flex;
      justify-content: center;
    }
 
    .btn {
      outline: none;
      display: inline-block;
      line-height: 1;
      white-space: nowrap;
      cursor: pointer;
      -webkit-appearance: none;
      text-align: center;
      -webkit-box-sizing: border-box;
      box-sizing: border-box;
      outline: 0;
      -webkit-transition: .1s;
      transition: .1s;
      font-weight: 500;
      padding: 8px 15px;
      font-size: 12px;
      border-radius: 3px;
      color: #fff;
      background-color: #409EFF;
      border-color: #409EFF;
      margin-right: 10px;
    }
  }
</style>

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

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

相关文章

5 个免费使用 GPT-4o 的方法

5 个免费使用 GPT-4o 的方法 虽然距离 OpenAI 发布 GPT-4o 已过去一天&#xff0c;我仍然对 GPT-4o 感到震撼。Demo 中语音助手功能实在是太令人惊叹了——它咯咯的笑声、准确的语气感叹和歌唱方式让 Siri 和 Google Assistant 显得相形见绌。 虽然备受期待的语音助手功能还要…

Elasticsearch:向量相似度技术和评分

作者&#xff1a;来自 Elastic Valentin Crettaz 当需要搜索自由文本并且 CtrlF / CmdF 不再有效时&#xff0c;使用词法搜索引擎通常是你想到的下一个合理选择。 词汇搜索引擎擅长分析要搜索的文本并将其标记为可在搜索时匹配的术语&#xff0c;但在理解和理解被索引和搜索的…

Acrel-2000L/A 绝缘监测系统设备 对多个绝缘检测仪进行统一数据管理

一、产品简介 Acrel-2000L/A 绝缘监测系统设备适用于 1kV 及以下低压配电系统。该设备可以集中采集监测显示绝缘监测仪的数据&#xff0c;实现最多 8 个绝缘监测仪的数据&#xff0c;并且实时记录告警信息和曲线查询。匹配的绝缘监测仪可以是 AIM-T300、AIM-T500 和 AIM-T500L。…

python 两种colorbar 最大最小和分类的绘制

1 colorbar 按照自定义的最值绘制 归一化方法使用Normalize(vmin0, vmax40.0) import numpy as np import matplotlib as mpl import matplotlib.pyplot as plt import matplotlib.cm as cm import matplotlib.colors as mcolors from matplotlib import rcParams from matplot…

【全开源】国际版JAVA同城服务美容美发到店服务上门服务系统源码支持Android+IOS+H5

国际版同城服务美容美发到店与上门服务系统&#xff1a;一站式打造美丽新体验 随着人们生活水平的提高和审美观念的升级&#xff0c;美容美发服务已成为人们日常生活中不可或缺的一部分。为了满足全球消费者的多样化需求&#xff0c;我们推出了“国际版同城服务美容美发到店与…

基于单片机的光照检测系统—光敏电阻

基于单片机的光照检测系统 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.光敏电阻实时采集环境光照值&#xff1b; 2.采用ADC0804将模拟值转换为数字量&#xff1b; 3.四位数码管显示当前的光照…

(gpt4o教程)gpt-4o如何开启和使用呢?

我发现&#xff0c;很多人反馈他的官网里没有gpt-4o的选项&#xff0c;下面介绍一下怎么查看是否使用了gpt-4o模型。 一、使用方法 1. 官网网站直接使用 2. 通过Open API申请接口使用 3. 通过LLM基准测试竞技场体验 还有其他方法&#xff0c;就不一一举例了。可以先看看上…

Linux之内存管理-malloc \kmalloc\vmalloc

1、malloc 函数 1.1分配内存小于128k,调用brk malloc是C库实现的函数&#xff0c;C库维护了一个缓存&#xff0c;当内存够用时&#xff0c;malloc直接从C库缓存分配&#xff0c;只有当C库缓存不够用&#xff1b; 当申请的内存小于128K时&#xff0c;通过系统调用brk&#xff…

提升写作效率的秘密武器:一个资深编辑的AI写作体验

有句话说:“写作是一项你坐在打字机前流血的工作。”而如今,各类生成式软件的涌现似乎打破了写作这一古老的艺术形式壁垒。过去,作家们独自在书桌前冥思苦想,如今,一款名为“玲珑AI工具”的ai写作助手正悄然改变着文案写作行业的创作生态,成为提升写作效率的秘密武器。 在传统…

STL—string类(1)

一、string类 1、为什么要学习string&#xff1f; C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP&#xff08;面向对象…

JVS物联网、无忧企业文档、规则引擎5.14功能新增说明

项目介绍 JVS是企业级数字化服务构建的基础脚手架&#xff0c;主要解决企业信息化项目交付难、实施效率低、开发成本高的问题&#xff0c;采用微服务配置化的方式&#xff0c;提供了 低代码数据分析物联网的核心能力产品&#xff0c;并构建了协同办公、企业常用的管理工具等&am…

uniapp 配置请求代理+请求封装

uniapp官网提供了三种方式&#xff1a;什么是跨域 | uni-app官网 1. 通过uniapp自带浏览器 打开项目是不存在跨域的 第二种方式&#xff1a; "h5" : {"template" : "static/index.html","devServer": {"proxy": {&quo…

汇凯金业:3个高效的黄金投资技巧

黄金投资中的高效技巧往往承载了许多投资前辈的智慧与经验教训&#xff0c;成为新手投资者宝贵的学习资料。历史上积累的黄金投资经验可以作为新投资者的学习榜样。 3个高效的黄金投资技巧 一、稳健的中长期投资策略 在金属投资领域虽然不乏短线交易高手&#xff0c;但新手投资…

BFS和DFS优先搜索算法

1. BFS与DFS 1.1 BFS DFS即Depth First Search&#xff0c;深度优先搜索。它是一种图遍历算法&#xff0c;它从一个起始点开始&#xff0c;逐层扩展搜索范围&#xff0c;直到找到目标节点为止。 这种算法通常用于解决“最短路径”问题&#xff0c;比如在迷宫中找到从起点到终…

若依微服务docker-compose 启动

docker-compose 文件 version : 3 services: ruoyi-nacos: container_name: ruoyi-nacos image: nacos/nacos-server build: context: ./nacos environment: - MODEstandalone volumes: - ./nacos/logs/:/home/nacos/logs - ./n…

SpringBoot+MybatisPlus实现读写分离,自动切换数据源

读写分离有必要吗&#xff1f; 实现读写分离势必要与你所做的项目相关&#xff0c;如果项目读多写少&#xff0c;那就可以设置读写分离&#xff0c;让“读”可以更快&#xff0c;因为你可以把你的“读”数据库的innodb设置为MyISAM引擎&#xff0c;让MySQL处理速度更快。 实现…

python turtle 升国旗

​一、导语 大家好,前段时间,我们画出了五星红旗,今天我们要用Python的Turtle库来绘制一个五星红旗,并让国旗上升,让我们一起来感受编程与艺术的完美结合吧!领略国家的强大!爱祖国,做一个遵纪守法的好公民。 二、效果展示 升国旗 三、开发过程 一、准备工作 首先我们…

品牌银饰售卖|基于SSM+vue的品牌银饰售卖平台的设计与实现(源码+数据库+文档)

品牌银饰售卖平台 目录 基于SSM&#xff0b;vue的品牌银饰售卖平台的设计与实现 一、前言 二、系统设计 三、系统功能设计 1前台功能模块 2后台功能模块 5.2.1管理员功能模块 5.2.2用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题…

怎么扫码查看文件内容?多文件一键生成二维码的方法

现在日常生活中经常会看到很多的二维码中包含文件&#xff0c;扫码后在手机上预览文件内容或者下载文件&#xff0c;有很多的应用场景下被使用。通过扫描二维码的方式实现文件的传递&#xff0c;与传统方式相比更加方便快捷。 这种方式能够提升获取文件的便捷性&#xff0c;而…

在大型项目上,Python 是个烂语言吗?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Python的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; python项目超过5万行&#x…