Condivisione della tecnologia

Ritaglio del caricamento delle immagini react-cropper

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

rendering

Installa il plug-in

npm i reagisce-cropper

O

aggiungere filatoreagire-coltivatore

codice principale

  1. import React, { useRef, useState } from 'react';
  2. import Cropper from 'react-cropper';
  3. import 'cropperjs/dist/cropper.css';
  4. import './index.less';
  5. import { UploadOutlined } from '@ant-design/icons';
  6. import { Upload, Button, Space, Divider } from 'antd';
  7. function cropper() {
  8. const cropperRef = useRef(null);
  9. const [imgsrc, setImgsrc] = useState(null); // 裁剪好的imgsrc
  10. const [image, setImage] = useState("https://img2.baidu.com/it/u=1361506290,4036378790&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=500"); // 记录图片
  11. const handleCrop = () => {
  12. const imageElement: any = cropperRef?.current;
  13. const cropper: any = imageElement?.cropper;
  14. const back64Cropper = cropper.getCroppedCanvas().toDataURL();
  15. console.log(cropper.getCroppedCanvas().toDataURL("image/jpeg"), "裁剪的base64编码");
  16. const base64Data = back64Cropper; // base64 格式的图像数据
  17. const url = base64ToUrl(base64Data); // 转换为 URL
  18. console.log("剪切url=", url); // 输出 URL
  19. setImgsrc(url);
  20. };
  21. function base64ToUrl(base64Data: any) {
  22. const blob = base64ToBlob(base64Data); // 将 base64 转为 Blob
  23. const url = URL.createObjectURL(blob); // 生成 URL
  24. return url;
  25. }
  26. function base64ToBlob(base64Data: any) {
  27. const byteString = atob(base64Data.split(',')[1]); // 将 base64 的数据部分解码成二进制数据
  28. const mimeString = base64Data.split(',')[0].split(':')[1].split(';')[0]; // 获取 MIME 类型
  29. const ab = new ArrayBuffer(byteString.length);
  30. const ia = new Uint8Array(ab);
  31. for (let i = 0; i < byteString.length; i++) {
  32. ia[i] = byteString.charCodeAt(i);
  33. }
  34. return new Blob([ab], { type: mimeString }); // 生成 Blob 对象
  35. }
  36. const replaceImg = (img) => {
  37. console.log(img.file, "img");
  38. // 通过FileReader读取用户选取的文件
  39. const reader = new FileReader();
  40. reader.readAsDataURL(img.file.originFileObj);
  41. //加载图片后获取到图片的base64格式
  42. reader.onload = ({ target: { result } = {} }) => {
  43. console.log(result, "base64");
  44. //更新替换为目标图片
  45. setImage(result);
  46. };
  47. return false;
  48. };
  49. return (
  50. <div className='copy'>
  51. <Cropper
  52. ref={cropperRef}
  53. // 你所需要剪切图片的路径
  54. src={image}
  55. // 设置其他相关参数例如裁剪框宽高比裁剪框移动限制等
  56. style={{ height: 400, width: '100%' }}
  57. // 裁剪比例
  58. aspectRatio={16 / 9}
  59. />
  60. <div className='copy-but'>
  61. <Space>
  62. <Upload fileList={[]} onChange={replaceImg} accept="image/*">
  63. <Button size='large' className="upload" icon={<UploadOutlined />}>
  64. 选择图片
  65. </Button>
  66. </Upload>
  67. <Button size='large' className="button" type="primary" onClick={handleCrop}>
  68. 确定裁剪
  69. </Button>
  70. </Space>
  71. </div>
  72. <div className='copy-img'>
  73. <Divider plain>裁剪好的图片</Divider>
  74. <div style={{ minHeight: "300px", minWidth: "500px", border: "1px solid #ccc", display: "flex", justifyContent: "center", alignItems: "center"}}>
  75. <img src={imgsrc} alt="" />
  76. </div>
  77. </div>
  78. </div>
  79. )
  80. }
  81. export default cropper