当前位置:首页 > VUE

vue实现图片上传裁剪

2026-02-25 04:48:08VUE

Vue 实现图片上传裁剪

安装依赖

需要安装 vue-cropperjscropperjs 库来处理图片裁剪功能。通过 npm 或 yarn 安装:

npm install vue-cropperjs cropperjs

组件引入

在 Vue 组件中引入 vue-cropper 并注册为局部组件:

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

export default {
  components: {
    VueCropper
  }
}

文件上传处理

通过 input 元素实现文件上传,监听 change 事件获取文件对象:

<input type="file" accept="image/*" @change="handleFileUpload">
methods: {
  handleFileUpload(e) {
    const file = e.target.files[0];
    if (!file) return;

    const reader = new FileReader();
    reader.onload = (event) => {
      this.imageSrc = event.target.result;
      this.$refs.cropper.replace(event.target.result);
    };
    reader.readAsDataURL(file);
  }
}

图片裁剪配置

初始化 vue-cropper 组件并配置裁剪参数:

<vue-cropper
  ref="cropper"
  :src="imageSrc"
  :aspect-ratio="16/9"
  :view-mode="1"
  :auto-crop-area="0.8"
></vue-cropper>

获取裁剪结果

调用 cropper 实例的 getCroppedCanvas 方法获取裁剪后的图片数据:

vue实现图片上传裁剪

methods: {
  cropImage() {
    this.$refs.cropper.getCroppedCanvas().toBlob((blob) => {
      const formData = new FormData();
      formData.append('image', blob, 'cropped-image.jpg');
      // 上传 formData 到服务器
    }, 'image/jpeg', 0.9);
  }
}

完整示例代码

<template>
  <div>
    <input type="file" accept="image/*" @change="handleFileUpload">
    <vue-cropper
      ref="cropper"
      :src="imageSrc"
      :aspect-ratio="16/9"
    ></vue-cropper>
    <button @click="cropImage">裁剪并上传</button>
  </div>
</template>

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

export default {
  components: { VueCropper },
  data() {
    return {
      imageSrc: ''
    };
  },
  methods: {
    handleFileUpload(e) {
      const file = e.target.files[0];
      if (!file) return;

      const reader = new FileReader();
      reader.onload = (event) => {
        this.imageSrc = event.target.result;
        this.$refs.cropper.replace(event.target.result);
      };
      reader.readAsDataURL(file);
    },
    cropImage() {
      this.$refs.cropper.getCroppedCanvas().toBlob((blob) => {
        const formData = new FormData();
        formData.append('image', blob, 'cropped-image.jpg');
        console.log('裁剪后的图片数据:', formData);
      }, 'image/jpeg');
    }
  }
};
</script>

注意事项

  • 裁剪比例通过 aspect-ratio 属性控制,设为 NaN 可自由调整。
  • 移动端需添加 touch-action: none 样式解决手势冲突问题。
  • 大图片建议压缩后再裁剪,避免性能问题。

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

相关文章

用vue实现滑动输入条

用vue实现滑动输入条

使用 Vue 实现滑动输入条 使用原生 HTML5 input range 实现 在 Vue 模板中直接使用 <input type="range">,通过 v-model 绑定数据:…

vue实现全景

vue实现全景

Vue 实现全景效果的方法 使用 Vue 实现全景效果通常需要结合第三方库或框架,以下是几种常见的方法: 使用 Three.js 和 Vue-Three.js Three.js 是一个强大的 3D…

vue实现grid

vue实现grid

Vue 实现 Grid 布局的方法 使用 CSS Grid 布局 Vue 可以结合 CSS Grid 布局实现灵活的网格系统。CSS Grid 是现代浏览器原生支持的布局方案,无需额外依赖库。 &l…

vue实现长按

vue实现长按

Vue 实现长按功能的方法 在 Vue 中实现长按功能可以通过原生事件监听或自定义指令完成。以下是几种常见实现方式: 使用原生事件监听 通过 @mousedown 和 @mouseup 或 @tou…

vue nexttick实现

vue nexttick实现

Vue 中 nextTick 的实现原理 Vue 的 nextTick 是一个用于在下次 DOM 更新循环结束之后执行延迟回调的方法。它的核心实现依赖于 JavaScript 的事件循环机制。…

vue实现menu

vue实现menu

Vue 实现 Menu 的方法 使用 Element UI 的 Menu 组件 Element UI 提供了现成的 Menu 组件,适合快速实现导航菜单。安装 Element UI 后,可以直接使用…