前端VUE后端java实现智能抠图

废话不说,先看效果

开发出来的效果是这样的,链接:智能抠图-商品抠图-人像抠图

实现原理:前端画布,处理图片,如果想要简单一点的可以不用画布,我这个功能因为想做好一点,支持自动裁剪,功能有通用抠图,商品抠图,人像抠图等功能;

接口文档对接:

智能抠图-api

下面就粘贴部分代码,需要需要完整代码的可以联系我

java 复制代码
package com.ruoyi.basicTool.imageAi.utils;

import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.system.util.AlyunOssConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

/**
 * 支持多种分割类型:通用、人像、商品等
 * 
 * @author dongbo
 */
@Slf4j
@Service
public class ImageSegmentationUtils {

    @Autowired
    private AlyunOssConfig alyunOssConfig;

    @Autowired
    private ImagePubUtils imagePubUtils;

    @Value("${aly.image.bucketName}")
    private String bucketName;

    @Value("${aly.image.endpoint}")
    private String endpoint;

    @Value("${aly.image.accessKeyId}")
    private String accessKeyId;

    @Value("${aly.image.accessKeySecret}")
    private String accessKeySecret;

  
    private String viaiRegion = "imageseg.cn-shanghai.aliyuncs.com";

    /**
     * 图像分割处理
     *
     * @param imageBytes 原始图片字节数组
     * @param contentType 图片Content-Type
     * @param action Action参数(如:SegmentCommonImage、SegmentBody、SegmentHead等)
     * @return 处理后的图片字节数组
     */
    public byte[] segmentImage(byte[] imageBytes, String contentType, String action) {
        imagePubUtils.validateConfig(accessKeyId, accessKeySecret, bucketName, endpoint);

        String tempOssUrl = null;
        try {
            log.info("开始处理图像分割,图片大小: {} bytes, 类型: {}, Action: {}",
                    imageBytes.length, contentType, action);

            if (contentType == null || contentType.isEmpty()) {
                throw new ServiceException("图片 Content-Type 为空");
            }
            AliyunImagesegRequestValidator.validate(action, imageBytes, contentType);

            // 上传图片到OSS(上海地域)
            tempOssUrl = imagePubUtils.uploadToOss(imageBytes, contentType, endpoint, bucketName, "segmentation/");
            log.info("图片已上传到OSS: {}", tempOssUrl);

            // 调用对应的分割API
            byte[] resultBytes = callSegmentationAPI(tempOssUrl, action);

            if (resultBytes == null || resultBytes.length == 0) {
                throw new RuntimeException("智能抠图处理失败,返回结果为空");
            }

            log.info("图像分割处理成功,返回图片大小: {} bytes", resultBytes.length);
            return resultBytes;

        } catch (ServiceException e) {
            throw e;
        } catch (Exception e) {
            log.error("图像分割处理失败: {}", e.getMessage(), e);
            throw new RuntimeException("智能抠图处理失败: " + e.getMessage(), e);
        } finally {
            // 清理临时OSS文件
            if (tempOssUrl != null) {
                try {
                    imagePubUtils.deleteFromOss(tempOssUrl, endpoint, bucketName);
                } catch (Exception e) {
                    log.warn("清理临时OSS文件失败: {}", e.getMessage());
                }
            }
        }
    }

    /**
     * 调用对应的分割API
     *
     * @param imageUrl 图片OSS URL
     * @param action Action参数
     * @return 处理后的图片字节数组
     */
    private byte[] callSegmentationAPI(String imageUrl, String action) throws Exception {
        log.info("调用图像分割API,图片URL: {}, Action: {}", imageUrl, action);

        try {
            // 构建请求参数
            Map<String, Object> params = new HashMap<>();
            params.put("ImageURL", imageUrl);

            // 调用HTTP API
            String response = AliyunVisionHttpUtils.callApi(
                    viaiRegion, accessKeyId, accessKeySecret, action, params);

            // 从响应中提取图片URL
            String resultImageURL = AliyunVisionHttpUtils.extractImageUrl(response);

            if (resultImageURL == null || resultImageURL.isEmpty()) {
                throw new RuntimeException("未能获取到抠图结果,响应: " + response);
            }

            log.info("图像分割API调用成功,结果URL: {}", resultImageURL);
            return imagePubUtils.downloadImageFromUrl(resultImageURL);

        } catch (ServiceException e) {
            throw e;
        } catch (Exception e) {
            log.error("图像分割API调用失败: {}", e.getMessage(), e);
            throw new RuntimeException("智能抠图请求失败: " + e.getMessage(), e);
        }
    }


    /**
     * 生成输出文件名
     */
    public String getOutputFileName(String originalFilename) {
        return imagePubUtils.getOutputFileName(originalFilename, "_segmented");
    }

    /**
     * 获取MediaType
     */
    public org.springframework.http.MediaType getMediaType(String contentType) {
        return imagePubUtils.getMediaType(contentType);
    }
}

上面就是代码了,想要完整代码的可以联系我

相关推荐
__log1 小时前
AI前端工程化实战指南:10大核心场景的“解题思路“与“避坑指南“
前端·人工智能
ljt27249606611 小时前
Vue笔记(一)--模板
前端·vue.js·笔记
广州华水科技1 小时前
单北斗GNSS变形监测一体机在水库安全监测中的应用与优势
前端
光影少年1 小时前
react的useRef 作用:获取DOM、保存可变数据、区别 createRef
前端·javascript·react.js
西洼工作室1 小时前
前端Token失效检测与自动登出机制详解
前端
李剑一1 小时前
华为二面稳了!面试官:请详细说明一下前端性能指标(FCP/LCP/CLS/TTI/TBT),如何采集、解读与优化?
前端·面试
KaMeidebaby7 小时前
卡梅德生物技术快报|骆驼纳米抗体:从原核表达、高通量测序到分子对接全流程实现
前端·数据库·其他·百度·新浪微博
子兮曰10 小时前
Node.js v26.1.0 深度解读:FFI、后量子密码与调试器的进化
前端·后端·node.js
测试员周周10 小时前
【Appium 系列】第06节-页面对象实现 — LoginPage 实战
开发语言·前端·人工智能·python·功能测试·appium·测试用例