当前位置:首页 > 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
  }
}

处理文件上传

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);
}

旋转图片

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();
}

上传到服务器

vue实现图片裁剪

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 实现缩放的方法 在 Vue 中实现缩放功能可以通过多种方式完成,以下是一些常见的方法: 使用 CSS transform 属性 通过 CSS 的 transform: scale() 属性可…

vue实现文字

vue实现文字

Vue 中实现文字显示的方法 在 Vue 中实现文字显示可以通过多种方式,包括插值表达式、指令、组件等。以下是几种常见的实现方法: 插值表达式 使用双大括号 {{ }} 进行文本插值,这是 Vue…

vue实现getapp

vue实现getapp

Vue 中实现全局获取应用实例的方法 在 Vue 3 中,可以通过 getCurrentInstance 方法获取当前组件实例,但需要明确其使用场景和限制。以下是具体实现方式: 方法一:通过 get…

vue实现翻页

vue实现翻页

Vue实现翻页功能 在Vue中实现翻页功能通常需要结合分页组件和数据请求逻辑。以下是常见的实现方法: 使用Element UI分页组件 安装Element UI后,可以直接使用其分页组件: <…

vue实现画板

vue实现画板

Vue 实现画板功能 在 Vue 中实现画板功能可以通过 HTML5 的 Canvas API 实现。以下是一个完整的实现方案: 创建 Vue 组件 新建一个 Vue 单文件组件(SFC),命名为…

黑马vue实现

黑马vue实现

以下是关于使用 Vue.js 实现黑马相关功能或项目的关键方法和实践指南: 环境配置与项目初始化 安装最新版 Vue CLI 或使用 Vite 创建项目: npm create vue@lates…