From eb61058fd176548946b4e67b8985f07a3b13ac5f Mon Sep 17 00:00:00 2001 From: Jerry Yan <792602257@qq.com> Date: Thu, 24 Jul 2025 00:32:49 +0800 Subject: [PATCH] =?UTF-8?q?BCE=E4=B8=B4=E6=97=B6=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../extern/AioDeviceController.java | 75 +++++++++++++++++++ .../image/enhancer/ImageEnhancerFactory.java | 4 + .../enhancer/adapter/BceImageEnhancer.java | 44 +++++++++++ .../image/enhancer/adapter/IEnhancer.java | 11 +++ .../enhancer/entity/BceEnhancerConfig.java | 11 +++ .../ycwl/basic/service/pc/SourceService.java | 2 +- .../service/pc/impl/SourceServiceImpl.java | 15 ++-- .../adapter/BceImageEnhancerTest.java | 30 ++++++++ 8 files changed, 185 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/ycwl/basic/image/enhancer/ImageEnhancerFactory.java create mode 100644 src/main/java/com/ycwl/basic/image/enhancer/adapter/BceImageEnhancer.java create mode 100644 src/main/java/com/ycwl/basic/image/enhancer/adapter/IEnhancer.java create mode 100644 src/main/java/com/ycwl/basic/image/enhancer/entity/BceEnhancerConfig.java create mode 100644 src/test/java/com/ycwl/basic/image/enhancer/adapter/BceImageEnhancerTest.java diff --git a/src/main/java/com/ycwl/basic/controller/extern/AioDeviceController.java b/src/main/java/com/ycwl/basic/controller/extern/AioDeviceController.java index dcf6356..6af7eb3 100644 --- a/src/main/java/com/ycwl/basic/controller/extern/AioDeviceController.java +++ b/src/main/java/com/ycwl/basic/controller/extern/AioDeviceController.java @@ -1,6 +1,9 @@ package com.ycwl.basic.controller.extern; +import cn.hutool.http.HttpUtil; import com.ycwl.basic.annotation.IgnoreToken; +import com.ycwl.basic.image.enhancer.adapter.BceImageEnhancer; +import com.ycwl.basic.image.enhancer.entity.BceEnhancerConfig; import com.ycwl.basic.mapper.AioDeviceMapper; import com.ycwl.basic.mapper.MemberMapper; import com.ycwl.basic.model.aio.entity.AioDeviceBannerEntity; @@ -21,13 +24,19 @@ import com.ycwl.basic.service.aio.AioDeviceService; import com.ycwl.basic.service.mobile.GoodsService; import com.ycwl.basic.service.pc.FaceService; import com.ycwl.basic.service.pc.OrderService; +import com.ycwl.basic.service.pc.ScenicService; +import com.ycwl.basic.service.pc.SourceService; +import com.ycwl.basic.storage.adapters.IStorageAdapter; import com.ycwl.basic.utils.ApiResponse; import com.ycwl.basic.utils.JwtTokenUtil; import com.ycwl.basic.utils.SnowFlakeUtil; import jakarta.servlet.ServletRequest; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Strings; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -37,8 +46,10 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import java.io.File; import java.util.Date; import java.util.List; +import java.util.concurrent.TimeUnit; @Slf4j @IgnoreToken @@ -57,6 +68,10 @@ public class AioDeviceController { private AioDeviceService aioDeviceService; @Autowired private OrderService orderService; + @Autowired + private RedisTemplate redisTemplate; + @Autowired + private SourceService sourceService; @GetMapping("/info") public ApiResponse getDeviceInfo(HttpServletRequest request) { @@ -105,6 +120,47 @@ public class AioDeviceController { memberEntity.setNickname("用户"); memberMapper.add(memberEntity); FaceRecognizeResp resp = faceService.faceUpload(file, aioDevice.getScenicId(), memberEntity.getId()); + // 尝试超分 + new Thread(() -> { + try { + Thread.sleep(2000L); + } catch (InterruptedException e) { + return; + } + GoodsReqQuery query = new GoodsReqQuery(); + query.setSourceType(2); + query.setFaceId(resp.getFaceId()); + List sourcePhotoList = goodsService.sourceGoodsList(query); + if (sourcePhotoList == null || sourcePhotoList.isEmpty()) { + log.info("无源图片"); + redisTemplate.opsForValue().set("aio:faceId:"+resp.getFaceId().toString()+":pass", "1", 1, TimeUnit.DAYS); + return; + } + log.info("超分开始!"); + sourcePhotoList.forEach(photo -> { + if (StringUtils.contains(photo.getUrl(), "_q_")) { + return; + } + try { + File dstFile = new File(photo.getGoodsId()+".jpg"); + long fileSize = HttpUtil.downloadFile(photo.getUrl(), dstFile); + log.info("超分开始:{}", fileSize); + BceImageEnhancer enhancer = getEnhancer(); + MultipartFile enhancedFile = enhancer.enhance(dstFile.getName()); + log.info("超分结束:{}", photo.getUrl()); + String url = sourceService.uploadAndUpdateUrl(photo.getGoodsId(), enhancedFile); + log.info("上传结束:->{}", url); + } catch (Exception e) { + log.error("超分失败:{}", photo.getGoodsId(), e); + } finally { + File _file = new File(photo.getGoodsId()+".jpg"); + if (_file.exists()) { + _file.delete(); + } + } + }); + redisTemplate.opsForValue().set("aio:faceId:"+sourcePhotoList.getFirst().getFaceId().toString()+":pass", "1", 1, TimeUnit.DAYS); + }).start(); return ApiResponse.success(resp); } @@ -113,6 +169,14 @@ public class AioDeviceController { public ApiResponse faceInfo(@PathVariable Long faceId) { return faceService.getById(faceId); } + @GetMapping("/face/{faceId}/check") + public ApiResponse faceCheck(@PathVariable Long faceId) { + if (redisTemplate.hasKey("aio:faceId:"+faceId.toString()+":pass")) { + return ApiResponse.success(true); + } else { + return ApiResponse.success(false); + } + } // 照片商品列表 @GetMapping("/{faceId}/photo") public ApiResponse> sourceGoodsList(@PathVariable Long faceId) { @@ -144,4 +208,15 @@ public class AioDeviceController { } return ApiResponse.success(orderService.queryOrder(orderId)); } + + private BceImageEnhancer getEnhancer() { + BceImageEnhancer enhancer = new BceImageEnhancer(); + BceEnhancerConfig config = new BceEnhancerConfig(); + config.setQps(1); + config.setAppId("119554288"); + config.setApiKey("OX6QoijgKio3eVtA0PiUVf7f"); + config.setSecretKey("dYatXReVriPeiktTjUblhfubpcmYfuMk"); + enhancer.setConfig(config); + return enhancer; + } } diff --git a/src/main/java/com/ycwl/basic/image/enhancer/ImageEnhancerFactory.java b/src/main/java/com/ycwl/basic/image/enhancer/ImageEnhancerFactory.java new file mode 100644 index 0000000..cbdc867 --- /dev/null +++ b/src/main/java/com/ycwl/basic/image/enhancer/ImageEnhancerFactory.java @@ -0,0 +1,4 @@ +package com.ycwl.basic.image.enhancer; + +public class ImageEnhancerFactory { +} diff --git a/src/main/java/com/ycwl/basic/image/enhancer/adapter/BceImageEnhancer.java b/src/main/java/com/ycwl/basic/image/enhancer/adapter/BceImageEnhancer.java new file mode 100644 index 0000000..cc59d82 --- /dev/null +++ b/src/main/java/com/ycwl/basic/image/enhancer/adapter/BceImageEnhancer.java @@ -0,0 +1,44 @@ +package com.ycwl.basic.image.enhancer.adapter; + +import com.baidu.aip.imageprocess.AipImageProcess; +import com.ycwl.basic.image.enhancer.entity.BceEnhancerConfig; +import com.ycwl.basic.image.util.ImageUtil; +import com.ycwl.basic.utils.ImageUtils; +import org.json.JSONObject; +import org.springframework.web.multipart.MultipartFile; + +import java.util.HashMap; +import java.util.Map; + +public class BceImageEnhancer implements IEnhancer { + private BceEnhancerConfig config; + + public boolean setConfig(BceEnhancerConfig config) { + this.config = config; + return true; + } + + @Override + public boolean loadConfig(Map _config) { + BceEnhancerConfig config = new BceEnhancerConfig(); + config.setAppId(_config.get("appId")); + config.setApiKey(_config.get("apiKey")); + config.setSecretKey(_config.get("secretKey")); + config.setQps(Float.parseFloat(_config.get("qps"))); + this.config = config; + return true; + } + + @Override + public MultipartFile enhance(String url) { + AipImageProcess client = getClient(); + HashMap options = new HashMap<>(); + JSONObject jsonObject = client.imageQualityEnhance(url, options); + return ImageUtils.base64ToMultipartFile(jsonObject.getString("image")); + } + + public AipImageProcess getClient() { + AipImageProcess client = new AipImageProcess(config.getAppId(), config.getApiKey(), config.getSecretKey()); + return client; + } +} diff --git a/src/main/java/com/ycwl/basic/image/enhancer/adapter/IEnhancer.java b/src/main/java/com/ycwl/basic/image/enhancer/adapter/IEnhancer.java new file mode 100644 index 0000000..2db4357 --- /dev/null +++ b/src/main/java/com/ycwl/basic/image/enhancer/adapter/IEnhancer.java @@ -0,0 +1,11 @@ +package com.ycwl.basic.image.enhancer.adapter; + +import org.springframework.web.multipart.MultipartFile; + +import java.util.Map; + +public interface IEnhancer { + boolean loadConfig(Map _config); + + public MultipartFile enhance(String url); +} diff --git a/src/main/java/com/ycwl/basic/image/enhancer/entity/BceEnhancerConfig.java b/src/main/java/com/ycwl/basic/image/enhancer/entity/BceEnhancerConfig.java new file mode 100644 index 0000000..30838e5 --- /dev/null +++ b/src/main/java/com/ycwl/basic/image/enhancer/entity/BceEnhancerConfig.java @@ -0,0 +1,11 @@ +package com.ycwl.basic.image.enhancer.entity; + +import lombok.Data; + +@Data +public class BceEnhancerConfig { + private String appId; + private String apiKey; + private String secretKey; + private float qps = 1.0f; +} diff --git a/src/main/java/com/ycwl/basic/service/pc/SourceService.java b/src/main/java/com/ycwl/basic/service/pc/SourceService.java index d17a3ff..b3d2ec8 100644 --- a/src/main/java/com/ycwl/basic/service/pc/SourceService.java +++ b/src/main/java/com/ycwl/basic/service/pc/SourceService.java @@ -21,5 +21,5 @@ public interface SourceService { ApiResponse update(SourceEntity source); ApiResponse cutVideo(Long id); - ApiResponse uploadAndUpdateUrl(Long id, org.springframework.web.multipart.MultipartFile file); + String uploadAndUpdateUrl(Long id, org.springframework.web.multipart.MultipartFile file); } diff --git a/src/main/java/com/ycwl/basic/service/pc/impl/SourceServiceImpl.java b/src/main/java/com/ycwl/basic/service/pc/impl/SourceServiceImpl.java index 4aa8aa3..0be84a4 100644 --- a/src/main/java/com/ycwl/basic/service/pc/impl/SourceServiceImpl.java +++ b/src/main/java/com/ycwl/basic/service/pc/impl/SourceServiceImpl.java @@ -2,6 +2,7 @@ package com.ycwl.basic.service.pc.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; +import com.ycwl.basic.exception.BaseException; import com.ycwl.basic.mapper.SourceMapper; import com.ycwl.basic.model.pc.source.entity.SourceEntity; import com.ycwl.basic.model.pc.source.req.SourceReqQuery; @@ -24,6 +25,8 @@ import java.net.URL; import java.util.Collections; import java.util.List; +import static com.ycwl.basic.constant.StorageConstant.PHOTO_PATH; + /** * @Author:longbinbin * @Date:2024/12/3 15:49 @@ -145,14 +148,14 @@ public class SourceServiceImpl implements SourceService { } @Override - public ApiResponse uploadAndUpdateUrl(Long id, MultipartFile file) { + public String uploadAndUpdateUrl(Long id, MultipartFile file) { SourceRespVO source = sourceMapper.getById(id); if (source == null) { - return ApiResponse.fail("该素材不存在"); + throw new BaseException("该素材不存在"); } try { IStorageAdapter adapter = scenicService.getScenicStorageAdapter(source.getScenicId()); - String uploadedUrl = adapter.uploadFile(file, "source", String.valueOf(id)); + String uploadedUrl = adapter.uploadFile(file, PHOTO_PATH, id + "_q_.jpg"); SourceEntity sourceUpd = new SourceEntity(); sourceUpd.setId(id); @@ -160,12 +163,12 @@ public class SourceServiceImpl implements SourceService { int updateResult = sourceMapper.update(sourceUpd); if (updateResult > 0) { - return ApiResponse.success(uploadedUrl); + return uploadedUrl; } else { - return ApiResponse.fail("更新URL失败"); + throw new BaseException("更新URL失败"); } } catch (Exception e) { - return ApiResponse.fail("文件上传失败: " + e.getMessage()); + throw new BaseException("文件上传失败: " + e.getMessage()); } } } diff --git a/src/test/java/com/ycwl/basic/image/enhancer/adapter/BceImageEnhancerTest.java b/src/test/java/com/ycwl/basic/image/enhancer/adapter/BceImageEnhancerTest.java new file mode 100644 index 0000000..19726d8 --- /dev/null +++ b/src/test/java/com/ycwl/basic/image/enhancer/adapter/BceImageEnhancerTest.java @@ -0,0 +1,30 @@ +package com.ycwl.basic.image.enhancer.adapter; + +import com.ycwl.basic.image.enhancer.entity.BceEnhancerConfig; +import org.junit.Test; +import org.springframework.web.multipart.MultipartFile; + +import java.io.File; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.*; + +public class BceImageEnhancerTest { + private BceImageEnhancer getEnhancer() { + BceImageEnhancer enhancer = new BceImageEnhancer(); + BceEnhancerConfig config = new BceEnhancerConfig(); + config.setQps(1); + config.setAppId("119554288"); + config.setApiKey("OX6QoijgKio3eVtA0PiUVf7f"); + config.setSecretKey("dYatXReVriPeiktTjUblhfubpcmYfuMk"); + enhancer.setConfig(config); + return enhancer; + } + + @Test + public void enhance() throws IOException { + BceImageEnhancer enhancer = getEnhancer(); + MultipartFile file = enhancer.enhance("8b84a9f5-44fc-4f7e-8550-710727c47070.jpg"); + file.transferTo(new File("out.jpg")); + } +} \ No newline at end of file