当前位置:首页 > VUE

vue实现图片裁剪

2026-03-09 22:37:16VUE

使用 vue-cropperjs 实现图片裁剪

安装 vue-cropperjs 依赖包

npm install vue-cropperjs --save

引入组件并注册

import VueCropper from 'vue-cropperjs';
import 'cropperjs/dist/cropper.css';

export default {
  components: {
    VueCropper
  }
}

模板中使用组件

<vue-cropper
  ref="cropper"
  :src="imgSrc"
  :aspectRatio="16/9"
  :viewMode="1"
  :autoCropArea="0.8"
  :guides="true"
  :background="false"
></vue-cropper>

实现基本裁剪功能

设置图片源

data() {
  return {
    imgSrc: '',
    croppedImage: null
  }
}

处理文件上传

vue实现图片裁剪

handleImageUpload(e) {
  const file = e.target.files[0];
  if (!file.type.includes('image/')) {
    alert('请选择图片文件');
    return;
  }

  const reader = new FileReader();
  reader.onload = (event) => {
    this.imgSrc = event.target.result;
  };
  reader.readAsDataURL(file);
}

执行裁剪操作

cropImage() {
  this.$refs.cropper.getCroppedCanvas().toBlob((blob) => {
    const reader = new FileReader();
    reader.onload = () => {
      this.croppedImage = reader.result;
    };
    reader.readAsDataURL(blob);
  });
}

添加自定义裁剪选项

设置裁剪比例

setAspectRatio(ratio) {
  this.$refs.cropper.setAspectRatio(ratio);
}

旋转图片

vue实现图片裁剪

rotate(degrees) {
  this.$refs.cropper.rotate(degrees);
}

缩放图片

zoom(percent) {
  this.$refs.cropper.relativeZoom(percent);
}

响应式处理

监听窗口变化

mounted() {
  window.addEventListener('resize', this.handleResize);
},
beforeDestroy() {
  window.removeEventListener('resize', this.handleResize);
},
methods: {
  handleResize() {
    this.$refs.cropper && this.$refs.cropper.replace();
  }
}

保存裁剪结果

下载裁剪后的图片

downloadCroppedImage() {
  const link = document.createElement('a');
  link.download = 'cropped-image.png';
  link.href = this.croppedImage;
  link.click();
}

上传到服务器

uploadCroppedImage() {
  const formData = new FormData();
  formData.append('image', this.dataURLtoBlob(this.croppedImage));

  axios.post('/upload', formData)
    .then(response => {
      console.log('上传成功', response);
    })
    .catch(error => {
      console.error('上传失败', error);
    });
},
dataURLtoBlob(dataurl) {
  const arr = dataurl.split(',');
  const mime = arr[0].match(/:(.*?);/)[1];
  const bstr = atob(arr[1]);
  let n = bstr.length;
  const u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([u8arr], { type: mime });
}

标签: 图片vue
分享给朋友:

相关文章

vue手写签名如何实现

vue手写签名如何实现

实现手写签名的基本思路 在Vue中实现手写签名功能,通常需要借助HTML5的Canvas API来捕获用户的绘制操作。核心流程包括初始化画布、监听触摸/鼠标事件、记录轨迹以及生成签名图片。…

vue 实现流程

vue 实现流程

Vue 实现流程 Vue.js 是一个渐进式 JavaScript 框架,用于构建用户界面。以下是 Vue 实现的基本流程: 安装 Vue.js 通过 CDN 引入或使用 npm/yarn 安装:…

vue实现答题

vue实现答题

Vue 实现答题功能 数据结构设计 使用 Vue 的响应式特性管理题目和答案数据。通常需要以下数据结构: data() { return { questions: [ {…

vue实现 treegrid

vue实现 treegrid

Vue 实现 TreeGrid 的方法 使用现成组件库 Element UI、Ant Design Vue 等流行组件库提供了现成的 TreeTable/TreeGrid 组件,可直接使用。 Ele…

vue实现分站

vue实现分站

Vue 实现分站的方案 在 Vue 中实现分站功能通常涉及路由配置、环境变量管理和动态加载资源。以下是几种常见的实现方式: 基于路由的分站实现 通过 Vue Router 配置多路由,区分不同站点的…

vue如何实现计算

vue如何实现计算

Vue 实现计算的方法 Vue 提供了多种方式来实现计算逻辑,包括计算属性、方法、侦听器等。以下是几种常见的实现方式: 计算属性(Computed Properties) 计算属性是基于它们的响应式…