编写一个头像裁剪组件(一)

需求是编写一个头像剪裁东西再封装成为一个组件,然后依据功用最先逐渐编写代码:先是上传图片 => 预览图片 => 编辑图片。

刚最先没有去斟酌兼容性的题目,直接编写upload部份的代码,参考了许多代码另有HTML5 FILE API以后,发明很少有React编写的如许的代码,由于想简朴一点,所以直接就运用


let file = e.target.files[0];
let url = window.URL.createObjectURL(file);
console.info(url);

打印出来的结果是:

blob:http://localhost:3001/396d3dbb-be52-4fd4-aaf9-50c0c04ecef9

这个是个DOMString范例的返回值,依据MDN:

A DOMString containing an object URL that can be used to reference the contents of the specified source object.

然后我想运用canvas去加载这个文件再对这个文件做裁剪的操纵,题目就来了,ctx.drawImage(img)不能直接去剖析到这个DOMString再加载出来,厥后网上发明确切要先转化成dataURL才被一般加载,然后就一向尝试如许的计划:

reader.readAsDataURL(file);

会报错:
Uncaught TypeError: Failed to execute 'readAsDataURL' on 'FileReader': parameter 1 is not of type 'Blob

没法被FileReader.readAsDataURL()顺遂转换,末了看了些stackoverflow上的计划,综合了一下。
代码以下:

import React from 'react';
import ReactDOM from 'react-dom';

class App extends React.Component{
    constructor(props){
        super(props);

        this.handleChange = this.handleChange.bind(this);
    }

    handleChange(e){
        console.info(url);

      if (window.FileReader){
          console.info("Support file reader");
          let file = e.target.files[0];
          let reader = new FileReader();
          let img = new Image();

          if(file && file.type.match('image.*')){
            reader.readAsDataURL(file);
          }else{
            console.info('Not match!')
          }

          reader.onload = e => {
            let ctx = this.canvas.getContext('2d');

            img.src = reader.result;
            ctx.drawImage(img,10,10);
          }

      }
   
    }

    render(){
        return <div>
            <input type="file" multiple onChange={this.handleChange}/>
            <canvas width="500px" 
                    height="500px"
                    style={{border:"solid 1px lightgrey"}}
                    ref={canvas=>this.canvas = canvas}/>
        </div>
    }
}

ReactDOM.render(<App/>,document.getElementById('root'));
    原文作者:vividW
    原文地址: https://segmentfault.com/a/1190000015822551
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞