react hooks里通过react-avatar-editor插件,实现图片剪裁,压缩功能

在项目中遇到了用户上传头像图片过大,api会报错的问题。

所以在上传之前我们需要把图片剪裁压缩一下。
呈现的效果如图:在这里插入图片描述

首先需要安装 react-avatar-editor 库:
npm install --save react-avatar-editor

手机端的页面,我用的是material-ui的组件

import Dialog from '@material-ui/core/Dialog';
import DialogActions from '@material-ui/core/DialogActions';
import DialogContent from '@material-ui/core/DialogContent';
import Button from '@material-ui/core/Button';
import DialogTitle from '@material-ui/core/DialogTitle';
import AvatarEditor from 'react-avatar-editor'
import Typography from '@material-ui/core/Typography';
import Slider from '@material-ui/core/Slider';

const style = {width:320, height: 320,cursor: 'move'};
return (
  <Dialog
     open={open}
     onClose={handleClose}
   >
    <DialogTitle id="alert-dialog-title">编辑图片</DialogTitle>
    <DialogContent>
      <AvatarEditor
        ref={setEditorRef}
        image={imagesrc}
        width={320}
        height={320}
        border={50}
        color={[255, 255, 255, 0.6]} // RGBA
        scale={scale}
        rotate={rotate}
        style={style}
        borderRadius={180}
      />
     <Typography orientation="left">缩放</Typography>
          <Slider onChange={(event, newValue) => { setScale(newValue) }} step={0.05} min={1} max={2} />
          <Typography orientation="left">旋转</Typography>
          <Slider onChange={(event, newValue) => { setRotate(newValue) }} step={90} min={0} max={270} />
    </DialogContent>
     <DialogActions>
          <Button onClick={handleClose} color="primary">
           取消
          </Button>
          <Button onClick={handleOk} color="primary" autoFocus>
            确认
          </Button>
        </DialogActions>
      </Dialog>

把获取到的图片转成二进制之后传给AvatarEditor插件

const handleFileInputChange = e => {
    const ImageFile = e.target.files[0];
    const fileReader = new FileReader();
       fileReader.readAsDataURL(ImageFile);
       fileReader.onload = (e) => {
       const data= e.target.result;
       setImagesrc(data);
    }
    setOpen(true);
  };
  const setEditorRef = (editor) => (setImageEditor(editor));

此时原始图片的信息已经在setEditorRef里了,我们把它放在imageEditor里,点击确定之后,通过imageEditor自带的函数把图片剪裁压缩成我们设置的尺寸。

const handleOk = () => {
    if (imageEditor) {   
      const canvasScaled = imageEditor.getImageScaledToCanvas().toDataURL();自带函数转成二进制
      onChange(canvasScaled);
    }else {onChange(imagesrc)}

    setOpen(false);
  }

这样大尺寸的图片就成功被我们剪裁压缩了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值