cropperjs的高度过大,详解vue项目中实现图片裁剪功能_vue

作者: 计算机前端  发布:2019-12-28

cropperjs的高度过大(container height too much)

标签(空格分隔): JavaScript


业务需要web头像裁切,用canvas写了个demo卡成一匹马,于是就去寻找现成的,发现了cropperjs这个lib,4k star。

在ionic项目中使用时(不打包app),发现高度总是远高于图片显示高度,查找Issues作者只是说给图片加最大宽度100%,这里需要注意,width: 100%的同时还必须给图片一个父容器,直接在ion-content下是没有作用的。

<ion-content>
  <input type="file" (change)="selectFile($event)">

  <div class="img-contaier">
    <img [src]="src" alt="图片 1" height="auto" width="100%" #img>
  </div>
  <img [src]="previewSrc" alt="图片 2" #preview>
  <button ion-button (click)="imgCropper()">cropper</button>
</ion-content>

import...

declare const Cropper;

@Component...

export class HomePage {
  public previewSrc: string;
  public cropper: any;
  public src: string;

  @ViewChild('img') img: ElementRef;
  @ViewChild('preview') preview: ElementRef;

  constructor(
    public navCtrl: NavController
  ) { }

  file2Base64(e) {
    const f = e;

    return new Promise((resolve, reject) => {
      if (f) {
        const reader = new FileReader();
        reader.onload = (file => function(_e) {
          resolve({ result: this.result, file: e});
        })(f);
        reader.readAsDataURL(f);
        return;
      }

      reject(`Get none files.`);
    });
  }

  selectFile(e) {
    const file = e.target.files[0];
    if (file) {
      this.file2Base64(file).then((data: any) => {
        this.src = data.result;
        if (this.cropper) this.cropper.destroy();
        this.img.nativeElement.onload = e => {
          this.cropperInit(e);
        }
      });
    }
  }

  cropperInit(e) {
    console.log(e);
    const image = e.target;
    this.cropper = new Cropper(image, {
      viewMode: 1,
      aspectRatio: 1 / 1,
      background: false
    });
  }

  imgCropper() {
    const str = this.cropper.getCroppedCanvas().toDataURL();
    this.previewSrc = str;
  }
}

图片 3

演示地址

前言

vue版本:3.6.3 cropperjs: 1.5.1 elementUI

使用 cropperjs插件 和 原生canvas 两种方式实现图片裁剪功能

使用cropperjs插件

安装cropperjs

yarn install cropperjs

初始化一个canvas元素,并在上面绘制图片

// 在canvas上绘制图片drawImg  => { // 获取canvas节点 let canvas = document.getElementById if  { // 设置canvas的宽为canvas的父元素宽度,宽高比3:2 let parentEle = canvas.parentElement canvas.width = parentEle.offsetWidth canvas.height = 2 * parentEle.offsetWidth / 3 let ctx = canvas.getContext ctx.clearRect(0, 0, canvas.width, canvas.height) let img = new Image() img.crossOrigin = 'Anonymous' img.src = this.data.src img.onload = function () { ctx.drawImage(img, 0, 0, canvas.width, canvas.height) } } })}

如果遇到canvas跨域绘制图片报错,设置图片img.crossOrigin = 'Anonymous',并且服务器响应头设置Access-Control-Allow-Origin:*

创建cropperjs

// 引入import Cropper from 'cropperjs'// 显示裁剪框initCropper () { let cropper = new Cropper(this.$refs.canvas, { checkCrossOrigin: true, viewMode: 2, aspectRatio: 3 / 2 })}

本文由澳门新萄京app发布于计算机前端,转载请注明出处:cropperjs的高度过大,详解vue项目中实现图片裁剪功能_vue

关键词: