提交修改

This commit is contained in:
quyixiao 2025-03-16 17:18:48 +08:00
parent 5f35645a0c
commit 2e1dfe5d23
6 changed files with 472 additions and 7 deletions

View File

@ -63,13 +63,13 @@ public class AScanImageHandle extends AlibabaBaseHandle<AScanImageRequest, ScanI
}
for (AScanImageRequestTask task : aScanImageRequest.getTasks()) {
if (StringUtils.isNotBlank(task.getBase64())) {
String url = ossFileUploadService.uploadFileContentByBase64(task.getBase64(),"jpg");
if (StringUtils.isNotBlank(task.getImageBase64())) {
String url = ossFileUploadService.uploadFileContentByBase64(task.getImageBase64(),"jpg");
if (StringUtils.isBlank(url)) {
log.error("AScanImageHandle oss file upload is null");
return "你的base64内容有误";
}
task.setUrl(url);
task.setImageUrl(url);
}
}
return null;
@ -87,7 +87,7 @@ public class AScanImageHandle extends AlibabaBaseHandle<AScanImageRequest, ScanI
ScanImageRequest.ScanImageRequestTask task1 = new ScanImageRequest.ScanImageRequestTask();
task1.setDataId(UUID.randomUUID().toString());
task1.setImageURL(task.getUrl());
task1.setImageURL(task.getImageUrl());
task1.setImageTimeMillisecond(task.getImageTimeMillisecond());
task1.setInterval(task.getInterval());
task1.setMaxFrames(task.getMaxFrames());

View File

@ -26,12 +26,12 @@ public class AScanImageRequestTask {
* 示例值:
* http://xxx.xxx.com/xxx.jpg
*/
public String url;
public String imageUrl;
/**
* 图片base64
*/
private String base64;
private String imageBase64;
/**
* 截帧频率GIF 图或者长图检测专用GIF 图可理解为图片数组 interval 张图片抽取一张进行检测只有该值存在时才会对 GIF 进行截帧长图同时支持长竖图和长横图
@ -51,4 +51,12 @@ public class AScanImageRequestTask {
* 1
*/
public Integer maxFrames;
/***
* 数据 ID需要保证在一次请求中所有的 ID 不重复
*
* 示例值:
* uuid-xxxx-xxxx-1234
*/
private String dataId;
}

View File

@ -81,7 +81,6 @@ public class ClassifyCommodityController extends BaseController {
resp.add(classifyCommodityResp);
}
}
return R.ok().setData(resp);

View File

@ -0,0 +1,155 @@
package com.heyu.api.controller.imageaudit;
import com.aliyun.imageaudit20191230.models.ScanImageResponse;
import com.aliyun.imageaudit20191230.models.ScanImageResponseBody;
import com.heyu.api.alibaba.handle.imageaudit.AScanImageHandle;
import com.heyu.api.alibaba.request.imageaudit.AScanImageRequest;
import com.heyu.api.alibaba.request.imageaudit.AScanImageRequestTask;
import com.heyu.api.controller.BaseController;
import com.heyu.api.data.annotation.CacheResult;
import com.heyu.api.data.annotation.NotIntercept;
import com.heyu.api.data.utils.ApiR;
import com.heyu.api.data.utils.R;
import com.heyu.api.request.imageaudit.ScanImageReq;
import com.heyu.api.resp.imageaudit.ScanImageResp;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/***
*
* https://next.api.aliyun.com/api/imageaudit/2019-12-30/ScanImage?RegionId=cn-shanghai
*
*图片内容安全 Scanlmage
*
*/
@Slf4j
@RestController
@RequestMapping("/image")
@NotIntercept
public class ScanImageController extends BaseController {
@Autowired
private AScanImageHandle aScanImageHandle;
@RequestMapping("/scan")
@CacheResult
public R scan(ScanImageReq req) {
ScanImageResp resp = new ScanImageResp();
AScanImageRequest request = new AScanImageRequest();
request.setScenes(req.getScenes());
List<AScanImageRequestTask> tasks = new ArrayList<>();
AScanImageRequestTask task = new AScanImageRequestTask();
task.setImageUrl(req.getImageUrl());
task.setImageBase64(req.getImageBase64());
tasks.add(task);
request.setTasks(tasks);
ApiR<ScanImageResponse> aR = aScanImageHandle.handle(request);
if (aR.isSuccess() && isSuccessStatusCode(aR.getData().getStatusCode())) {
ScanImageResponseBody.ScanImageResponseBodyData responseBodyData = aR.getData().getBody().getData();
if (CollectionUtils.isNotEmpty(responseBodyData.getResults())) {
for (ScanImageResponseBody.ScanImageResponseBodyDataResults result : responseBodyData.getResults()) {
List<ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResults> subResults = result.getSubResults();
resp.setImageURL(resp.getImageURL());
List<ScanImageResp.SubResults> subResultsList = new ArrayList<>();
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResults resultsSubResults : subResults) {
ScanImageResp.SubResults subResult = new ScanImageResp.SubResults();
List<ScanImageResp.SubResultsFrames> subResultsFrames = new ArrayList<>();
List<ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsFrames> resultsSubResultsFrames = resultsSubResults.getFrames();
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsFrames resultsSubResultsFrame : resultsSubResultsFrames) {
ScanImageResp.SubResultsFrames resultsFrames = new ScanImageResp.SubResultsFrames();
resultsFrames.setURL(resultsSubResultsFrame.getURL());
resultsFrames.setRate(resultsSubResultsFrame.getRate());
subResultsFrames.add(resultsFrames);
}
subResult.setSubResultsFrames(subResultsFrames);
List<ScanImageResp.SubResultsHintWordsInfoList> subResultsHintWordsInfoList = new ArrayList<>();
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsHintWordsInfoList resultsSubResultsHintWordsInfoList : resultsSubResults.getHintWordsInfoList()) {
ScanImageResp.SubResultsHintWordsInfoList resultsHintWordsInfoList = new ScanImageResp.SubResultsHintWordsInfoList();
resultsHintWordsInfoList.setContext(resultsSubResultsHintWordsInfoList.getContext());
subResultsHintWordsInfoList.add(resultsHintWordsInfoList);
}
subResult.setSubResultsHintWordsInfoList(subResultsHintWordsInfoList);
List<ScanImageResp.SubResultsLogoDataList> subResultsLogoDataList = new ArrayList<>();
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsLogoDataList resultsSubResultsLogoDataList : resultsSubResults.getLogoDataList()) {
ScanImageResp.SubResultsLogoDataList resultsLogoDataList = new ScanImageResp.SubResultsLogoDataList();
resultsLogoDataList.setX(resultsSubResultsLogoDataList.getX());
resultsLogoDataList.setY(resultsSubResultsLogoDataList.getY());
resultsLogoDataList.setWidth(resultsSubResultsLogoDataList.getWidth());
resultsLogoDataList.setHeight(resultsSubResultsLogoDataList.getHeight());
resultsLogoDataList.setName(resultsSubResultsLogoDataList.getName());
resultsLogoDataList.setType(resultsSubResultsLogoDataList.getType());
subResultsLogoDataList.add(resultsLogoDataList);
}
subResult.setSubResultsLogoDataList(subResultsLogoDataList);
subResult.setOCRDataList(resultsSubResults.getOCRDataList());
List<ScanImageResp.SubResultsProgramCodeDataList> subResultsProgramCodeDataListList = new ArrayList<>();
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsProgramCodeDataList resultsSubResultsProgramCodeDataList : resultsSubResults.getProgramCodeDataList()) {
ScanImageResp.SubResultsProgramCodeDataList resultsProgramCodeDataList = new ScanImageResp.SubResultsProgramCodeDataList();
resultsProgramCodeDataList.setHeight(resultsSubResultsProgramCodeDataList.getHeight());
resultsProgramCodeDataList.setWidth(resultsSubResultsProgramCodeDataList.getWidth());
resultsProgramCodeDataList.setX(resultsSubResultsProgramCodeDataList.getX());
resultsProgramCodeDataList.setY(resultsSubResultsProgramCodeDataList.getY());
subResultsProgramCodeDataListList.add(resultsProgramCodeDataList);
}
subResult.setSubResultsProgramCodeDataListList(subResultsProgramCodeDataListList);
List<ScanImageResp.SubResultsSfaceDataList> sfaceDataList = new ArrayList<>();
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsSfaceDataList resultsSubResultsSfaceDataList : resultsSubResults.getSfaceDataList()) {
ScanImageResp.SubResultsSfaceDataList resultsSfaceDataList = new ScanImageResp.SubResultsSfaceDataList();
List<ScanImageResp.SubResultsSfaceDataListFaces> faces = new ArrayList<>();
for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsSfaceDataListFaces face : resultsSubResultsSfaceDataList.getFaces()) {
ScanImageResp.SubResultsSfaceDataListFaces facesData = new ScanImageResp.SubResultsSfaceDataListFaces();
facesData.setId(face.getId());
facesData.setName(face.getName());
facesData.setRate(face.getRate());
faces.add(facesData);
}
resultsSfaceDataList.setFaces(faces);
sfaceDataList.add(resultsSfaceDataList);
}
subResult.setSfaceDataList(sfaceDataList);
subResultsList.add(subResult);
}
resp.setSubResults(subResultsList);
return R.ok().setData(resp);
}
}
}
return R.error(aR.getErrorMsg());
}
}

View File

@ -0,0 +1,34 @@
package com.heyu.api.request.imageaudit;
import com.heyu.api.request.CommonReq;
import lombok.Data;
import java.util.List;
@Data
public class ScanImageReq extends CommonReq {
/**
* 指定图片检测的应用场景可选值包括
* <p>
* porn图片智能鉴黄
* <p>
* terrorism图片敏感内容识别图片风险人物识别
* <p>
* ad图片垃圾广告识别
* <p>
* live图片不良场景识别
* <p>
* logo图片 Logo 识别
* <p>
* 说明 支持多场景scenes一起检测例如scenes=[porn, terrorism]即对一张图片同时进行鉴黄和涉恐识别此时也会按照两个场景计费
* 示例值:
* porn
*/
public List<String> scenes;
}

View File

@ -0,0 +1,269 @@
package com.heyu.api.resp.imageaudit;
import com.heyu.api.data.dto.BaseResp;
import lombok.Data;
import java.util.List;
/***
*
*
* https://next.api.aliyun.com/api/imageaudit/2019-12-30/ScanImage?RegionId=cn-shanghai&params={%22Task%22:[{%22ImageURL%22:%22http://workbench-file-transfer.oss-cn-shanghai.aliyuncs.com/user-files/3d1ce4eb-1ff5-4210-adf1-8f4413cd39e7-Xnip2025-03-16_16-03-24.jpg?OSSAccessKeyId&Expires=1742112424&Signature=h5EZtZ5dk4hiLMKw7oEK1NsdSwQ%3D&response-content-disposition=attachment%22}]}&tab=DOC&lang=JAVA
*
*
*
*/
@Data
public class ScanImageResp extends BaseResp {
/***
* 图像 URL 地址
*
* 示例值:
* http://xxx.xxx.xxx/xxx.jpg
*
*/
private String imageURL;
private List<SubResults> subResults;
/***
* 单张图片的检测结果
*
*/
@Data
public static class SubResults {
/**
* 如果待检测图片因为过长被截断该参数返回截断后的每一帧图像的临时访问地址供您参考
* 被截断的图片的临时访问 URL地址有效期是 5 分钟
*
* 示例值:
* http://xxx.xxx.com/xxx-0.jpg
* Rate
* number<float>
* 结果为该分类的概率取值范围为 0~100值越高表示越有可能属于该分类
*
* 示例值:
* 89.85
*/
private List<SubResultsFrames> subResultsFrames;
/***
* 图片中含有广告时返回图片中广告文字命中的风险关键词信息格式为数组
*
* 说明 仅适用于 ad 场景示例值hintWordsInfo:[{context:敏感词}]
*
*/
private List<SubResultsHintWordsInfoList> subResultsHintWordsInfoList;
/***
* 图片中含有 Logo 返回识别出来的 Logo 信息
*
* 说明 仅适用于 Logo 场景
*/
private List<SubResultsLogoDataList> subResultsLogoDataList;
/***
* 识别到的图片中的完整文字信息
*
* 示例值:
* abc
*
*/
public java.util.List<String> OCRDataList;
/***
* 图片中含有小程序码时返回小程序码的位置信息
*
* 说明 仅适用于 qrcode 场景且已通过钉钉群23109592联系我们开通了小程序码识别
*
*/
private List<SubResultsProgramCodeDataList> subResultsProgramCodeDataListList;
public Float rate;
public String scene;
/***
* 图片中包含暴恐敏感内容时返回识别出来的暴恐敏感信息
*
* 说明 仅适用于 terrorism sface 场景关于该参数在 sface 场景中的具体内容请参见敏感人脸检测
*
*/
public java.util.List<SubResultsSfaceDataList> sfaceDataList;
/**
* 建议您执行的操作
*
* pass图片正常无需进行其余操作或者未识别出目标对象
*
* review检测结果不确定需要进行人工审核或者未识别出目标对象
*
* block图片违规建议执行进一步操作如直接删除或做限制处理
*
* 示例值:
* block
*
*/
public String suggestion;
}
@Data
public static class SubResultsFrames {
public Float rate;
public String URL;
}
@Data
public static class SubResultsHintWordsInfoList {
public String context;
}
@Data
public static class SubResultsLogoDataList {
/**
* Logo 区域高度
*
* 示例值:
* 106
*/
public Float height;
/**
* 识别出的 Logo 名称
*
* 示例值:
* abc
*/
public String name;
/**
* 识别出的 logo 类型取值为 TV台标
*
* 示例值:
* TV
*/
public String type;
/**
* Logo 区域宽度
*
* 示例值:
* 106
*
*/
public Float width;
/**
* 以图片左上角为坐标原点Logo 区域左上角到 x 轴距离
*
* 示例值:
* 68
*/
public Float x;
/**
* 以图片左上角为坐标原点Logo 区域左上角到 y 轴距离
*
* 示例值:
* 140
*/
public Float y;
}
@Data
public static class SubResultsProgramCodeDataList {
/**
*小程序码区域高度
*
* 示例值:
* 413.0
*/
public Float height;
/**
* 小程序码区域宽度
*
* 示例值:
* 402.0
*/
public Float width;
/**
* 以图片左上角为坐标原点小程序码区域左上角到 y 轴距离
*
* 示例值:
* 11.0
*
*/
public Float x;
/**
* 以图片左上角为坐标原点小程序码区域左上角到 x 轴距离
*
* 示例值:
* 0.0
*/
public Float y;
}
@Data
public static class SubResultsSfaceDataListFaces {
/***
* 人脸 ID
*
* 示例值:
* AliFace_0001234
*/
public String id;
/**
* 相似人物的名称
*
* 示例值:
* abc
*/
public String name;
/**
* 相似概率
*
* 示例值:
* 91.54
*/
public Float rate;
}
@Data
public static class SubResultsSfaceDataList {
/**
* 识别出的人脸信息
*/
public List<SubResultsSfaceDataListFaces> faces;
}
}