文件上传和智能抠图示例

1.下载包
npm i @imgly/background-removal
2.使用这个第三方开源的包 

代码如下

import React, { useState } from 'react';
import './index.scss';
import { removeBackground } from '@imgly/background-removal';
import { Spin, Button, Upload, message } from 'antd';
import { UploadOutlined } from '@ant-design/icons';

function App() {
    // 用于保存用户上传的文件
    const [file, setFile] = useState(null);
    // 用于保存上传或处理的消息
    const [messageText, setMessageText] = useState('');
    // 用于保存文件的预览图像 URL
    const [preview, setPreview] = useState('');
    // 用于保存处理后的图像 URL
    const [processedImage, setProcessedImage] = useState('');
    // 用于控制 loading 状态
    const [loading, setLoading] = useState(false);

    // 处理文件选择事件
    const handleFileChange = (event) => {
        const selectedFile = event.target.files[0];
        if (selectedFile) {
            setFile(selectedFile); // 更新选中的文件
            setMessageText(''); // 清空消息
            setPreview(URL.createObjectURL(selectedFile)); // 设置文件的预览图像 URL
            setProcessedImage(''); // 清空处理后的图像
        }
    };

    // 处理文件上传和图像处理
    const handleUpload = async () => {
        if (!file) {
            setMessageText('请先选择一个文件。'); // 提示用户选择文件
            return;
        }

        setLoading(true); // 开始加载状态

        try {
            // 将选中的文件转换为 Blob 对象
            const fileBlob = new Blob([file], { type: file.type });
            console.log('File Blob:', fileBlob); // 调试用:打印文件 Blob 对象

            // 调用 removeBackground 函数处理图像
            const processedBlob = await removeBackground(fileBlob);
            console.log('Processed Blob:', processedBlob); // 调试用:打印处理后的 Blob 对象

            // 将处理后的 Blob 对象转换为 URL
            const processedUrl = URL.createObjectURL(processedBlob);
            console.log('Processed URL:', processedUrl); // 调试用:打印处理后的图像 URL

            // 更新处理后的图像 URL
            setProcessedImage(processedUrl);
            setMessageText('文件上传并处理成功!'); // 提示用户处理成功
        } catch (error) {
            console.error(error); // 打印错误信息
            setMessageText('处理文件时出错。'); // 提示用户处理出错
        } finally {
            setLoading(false); // 结束加载状态
        }
    };

    return (
        <div className="App">
            <h1>文件上传和智能抠图示例</h1>
            {/* 文件选择输入框 */}
            <Upload
                customRequest={({ file, onSuccess }) => {
                    handleFileChange({ target: { files: [file] } });
                    onSuccess();
                }}
                showUploadList={false}
            >
                <Button icon={<UploadOutlined />}>选择文件</Button>
            </Upload>
            {/* 上传并处理文件的按钮 */}
            <Button type="primary" onClick={handleUpload} disabled={loading}>
                上传并处理文件
            </Button>
            {/* 显示 loading 效果 */}
            {loading && <Spin size="large" />}
            {/* 显示消息 */}
            {messageText && <div className="message">{messageText}</div>}
            {/* 显示文件的预览图像 */}
            {preview && (
                <div className="preview">
                    <h2>原始图像</h2>
                    <img src={preview} alt="Preview" />
                </div>
            )}
            {/* 显示处理后的图像 */}
            {processedImage && (
                <div className="processed-preview">
                    <h2>处理后的图像</h2>
                    <img src={processedImage} alt="Processed Preview" />
                </div>
            )}
        </div>
    );
}

export default App;
3.样式代码 如下

.App {
    text-align: center;
    margin: 20px;
}

.ant-btn {
    margin: 10px;
}

.ant-spin {
    margin: 20px 0;
}

.message {
    margin: 20px 0;
    font-size: 16px;
    color: green;
}

.preview,
.processed-preview {
    margin: 20px 0;
}

.preview img,
.processed-preview img {
    max-width: 100%;
    height: auto;
}
 

  • 13
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

韩一ovo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值