当前位置: 首页 > news >正文

图片上传裁剪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); // 裁剪好的imgsrcconst [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); // 转换为 URLconsole.log("剪切url=", url); // 输出 URLsetImgsrc(url);};function base64ToUrl(base64Data: any) {const blob = base64ToBlob(base64Data); // 将 base64 转为 Blobconst url = URL.createObjectURL(blob); // 生成 URLreturn 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'><Cropperref={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

http://www.lryc.cn/news/400249.html

相关文章:

  • 跨越空间的编码:在PyCharm中高效使用远程解释器
  • Vue3单文件jsx输出多组件示例遇到的坑
  • OpenCV中的轮廓检测cv2.findContours()
  • JFlash读取和烧录加密stm32程序
  • 【总结】实际业务场景中锁、事务、异常如何考虑使用?
  • Pytorch使用Dataset加载数据
  • 【nginx】nginx的优点
  • K8S ingress 初体验 - ingress-ngnix 的安装与使用
  • qt 获取父控件
  • flask基础配置详情
  • 单相整流-TI视频课笔记
  • 用GPT 4o提高效率
  • 20240711每日消息队列-------------MQ消息的积压的折磨
  • 推荐一个比 Jenkins 使用更简单的项目构建和部署工具
  • java 在pdf中根据关键字位置插入图片(公章、签名等)
  • 施耐德EOCR系列电机保护器全面升级后無端子型
  • 27.数码管的驱动,使用74HC595移位寄存器芯片
  • TCP/IP 原理、实现方式与优缺点
  • 利率债与信用债的区别及其与债券型基金的关系
  • linux下解压命令
  • Vulnhub靶场DC-3-2练习
  • Swift入门笔记
  • 【提交ACM出版 | EIScopus检索稳定 | 高录用】第五届大数据与社会科学国际学术会议(ICBDSS 2024,8月16-18)
  • Postman与世界相连:集成第三方服务的全面指南
  • Perl 语言开发(十四):数据库操作
  • Qt+ESP32+SQLite 智能大棚
  • Android Viewpager2 remove fragmen不生效解决方案
  • 桃园南路上的红绿灯c++
  • 有关去中心化算路大模型的一些误区:低带宽互连导致训练速度太慢;小容量设备无法生成基础规模的模型;去中心化总是会花费更多;虫群永远不够大
  • uni-app iOS上架相关App store App store connect 云打包有次数限制