图片上传裁剪react-cropper

效果图

安装插件

npm  i  react-cropper

或者

yarn  add  react-cropper

主要代码

import React, { useRef, useState } from 'react';
import Cropper from 'react-cropper';
import 'cropperjs/dist/cropper.css';
import './index.less';
import { UploadOutlined } from '@ant-design/icons';
import { Upload, Button, Space, Divider } from 'antd';


function cropper() {
    const cropperRef = useRef(null);
    const [imgsrc, setImgsrc] = useState(null); // 裁剪好的imgsrc
    const [image, setImage] = useState("https://img2.baidu.com/it/u=1361506290,4036378790&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500"); // 记录图片

    const handleCrop = () => {
        const imageElement: any = cropperRef?.current;
        const cropper: any = imageElement?.cropper;
        const back64Cropper = cropper.getCroppedCanvas().toDataURL();
        console.log(cropper.getCroppedCanvas().toDataURL("image/jpeg"), "裁剪的base64编码");
        const base64Data = back64Cropper; // base64 格式的图像数据
        const url = base64ToUrl(base64Data); // 转换为 URL
        console.log("剪切url=", url); // 输出 URL

        setImgsrc(url);
    };

    function base64ToUrl(base64Data: any) {
        const blob = base64ToBlob(base64Data); // 将 base64 转为 Blob
        const url = URL.createObjectURL(blob); // 生成 URL
        return url;
    }

    function base64ToBlob(base64Data: any) {
        const byteString = atob(base64Data.split(',')[1]); // 将 base64 的数据部分解码成二进制数据
        const mimeString = base64Data.split(',')[0].split(':')[1].split(';')[0]; // 获取 MIME 类型
        const ab = new ArrayBuffer(byteString.length);
        const ia = new Uint8Array(ab);
        for (let i = 0; i < byteString.length; i++) {
            ia[i] = byteString.charCodeAt(i);
        }
        return new Blob([ab], { type: mimeString }); // 生成 Blob 对象
    }

    const replaceImg = (img) => {
        console.log(img.file, "img");
        // 通过FileReader读取用户选取的文件
        const reader = new FileReader();
        reader.readAsDataURL(img.file.originFileObj);
        //加载图片后获取到图片的base64格式
        reader.onload = ({ target: { result } = {} }) => {
            console.log(result, "base64");
            //更新替换为目标图片
            setImage(result);
        };
        return false;
    };



    return (
        <div className='copy'>
            <Cropper
                ref={cropperRef}
                // 你所需要剪切图片的路径
                src={image}
                // 设置其他相关参数,例如裁剪框宽高比、裁剪框移动限制等
                style={{ height: 400, width: '100%' }}
                // 裁剪比例
                aspectRatio={16 / 9}
            />
            <div className='copy-but'>
                <Space>
                    <Upload fileList={[]} onChange={replaceImg} accept="image/*">
                        <Button size='large' className="upload" icon={<UploadOutlined />}>
                            选择图片
                        </Button>
                    </Upload>
                    <Button size='large' className="button" type="primary" onClick={handleCrop}>
                        确定裁剪
                    </Button>
                </Space>
            </div>
            <div className='copy-img'>
                <Divider plain>裁剪好的图片</Divider>
                <div style={{ minHeight: "300px", minWidth: "500px", border: "1px solid #ccc", display: "flex", justifyContent: "center", alignItems: "center"}}>
                    <img src={imgsrc} alt="" />
                </div>

            </div>
        </div>
    )
}

export default cropper

相关推荐

  1. 图片裁剪-cropperjs

    2024-07-12 20:50:03       21 阅读
  2. Vue使用vue-img-cropper实现图片裁剪

    2024-07-12 20:50:03       55 阅读
  3. Vue使用vue-cropper裁剪图片作头像

    2024-07-12 20:50:03       21 阅读
  4. vue2 结合 elementui 实现图片裁剪

    2024-07-12 20:50:03       28 阅读
  5. react native二进制图片、视频的方法

    2024-07-12 20:50:03       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 20:50:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 20:50:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 20:50:03       57 阅读
  4. Python语言-面向对象

    2024-07-12 20:50:03       68 阅读

热门阅读

  1. 简单有效防止CDN被盗刷流量

    2024-07-12 20:50:03       17 阅读
  2. Linux 命令个人学习笔记

    2024-07-12 20:50:03       18 阅读
  3. SpringBoot实现Read Through模式

    2024-07-12 20:50:03       20 阅读
  4. linux中vim切换输入中文

    2024-07-12 20:50:03       17 阅读
  5. 模型剪枝知识点整理

    2024-07-12 20:50:03       21 阅读
  6. 雅思词汇及发音积累 2024.7.12

    2024-07-12 20:50:03       23 阅读
  7. php上传文件

    2024-07-12 20:50:03       17 阅读
  8. linux kernel ptr dump

    2024-07-12 20:50:03       19 阅读