diff --git a/api-third/src/main/java/com/heyu/api/alibaba/handle/imageaudit/AScanImageHandle.java b/api-third/src/main/java/com/heyu/api/alibaba/handle/imageaudit/AScanImageHandle.java index 1335269..c6746ac 100644 --- a/api-third/src/main/java/com/heyu/api/alibaba/handle/imageaudit/AScanImageHandle.java +++ b/api-third/src/main/java/com/heyu/api/alibaba/handle/imageaudit/AScanImageHandle.java @@ -63,13 +63,13 @@ public class AScanImageHandle extends AlibabaBaseHandle tasks = new ArrayList<>(); + AScanImageRequestTask task = new AScanImageRequestTask(); + + task.setImageUrl(req.getImageUrl()); + task.setImageBase64(req.getImageBase64()); + + tasks.add(task); + request.setTasks(tasks); + + ApiR 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 subResults = result.getSubResults(); + resp.setImageURL(resp.getImageURL()); + List subResultsList = new ArrayList<>(); + for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResults resultsSubResults : subResults) { + ScanImageResp.SubResults subResult = new ScanImageResp.SubResults(); + + List subResultsFrames = new ArrayList<>(); + + List 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 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 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 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 sfaceDataList = new ArrayList<>(); + + for (ScanImageResponseBody.ScanImageResponseBodyDataResultsSubResultsSfaceDataList resultsSubResultsSfaceDataList : resultsSubResults.getSfaceDataList()) { + ScanImageResp.SubResultsSfaceDataList resultsSfaceDataList = new ScanImageResp.SubResultsSfaceDataList(); + List 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()); + } + + +} diff --git a/api-web/api-interface/src/main/java/com/heyu/api/request/imageaudit/ScanImageReq.java b/api-web/api-interface/src/main/java/com/heyu/api/request/imageaudit/ScanImageReq.java new file mode 100644 index 0000000..6dfd586 --- /dev/null +++ b/api-web/api-interface/src/main/java/com/heyu/api/request/imageaudit/ScanImageReq.java @@ -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 { + + /** + * 指定图片检测的应用场景,可选值包括: + *

+ * porn:图片智能鉴黄 + *

+ * terrorism:图片敏感内容识别、图片风险人物识别 + *

+ * ad:图片垃圾广告识别 + *

+ * live:图片不良场景识别 + *

+ * logo:图片 Logo 识别 + *

+ * 说明 支持多场景(scenes)一起检测。例如scenes=[“porn”, “terrorism”],即对一张图片同时进行鉴黄和涉恐识别,此时也会按照两个场景计费。 + * 示例值: + * porn + */ + public List scenes; + + + + +} diff --git a/api-web/api-interface/src/main/java/com/heyu/api/resp/imageaudit/ScanImageResp.java b/api-web/api-interface/src/main/java/com/heyu/api/resp/imageaudit/ScanImageResp.java new file mode 100644 index 0000000..ef75d99 --- /dev/null +++ b/api-web/api-interface/src/main/java/com/heyu/api/resp/imageaudit/ScanImageResp.java @@ -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¶ms={%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; + + + /*** + * 单张图片的检测结果。 + * + */ + @Data + public static class SubResults { + /** + * 如果待检测图片因为过长被截断,该参数返回截断后的每一帧图像的临时访问地址供您参考。 + * 被截断的图片的临时访问 URL,地址有效期是 5 分钟。 + * + * 示例值: + * http://xxx.xxx.com/xxx-0.jpg + * Rate + * number + * 结果为该分类的概率,取值范围为 0~100。值越高,表示越有可能属于该分类。 + * + * 示例值: + * 89.85 + */ + private List subResultsFrames; + + /*** + * 图片中含有广告时,返回图片中广告文字命中的风险关键词信息。格式为数组。 + * + * 说明 仅适用于 ad 场景。示例值:”hintWordsInfo”:[{“context”:”敏感词”}]。 + * + */ + private List subResultsHintWordsInfoList; + + /*** + * 图片中含有 Logo 时,返回识别出来的 Logo 信息。 + * + * 说明 仅适用于 Logo 场景。 + */ + private List subResultsLogoDataList; + + + /*** + * 识别到的图片中的完整文字信息。 + * + * 示例值: + * abc + * + */ + public java.util.List OCRDataList; + + /*** + * 图片中含有小程序码时,返回小程序码的位置信息。 + * + * 说明 仅适用于 qrcode 场景,且已通过钉钉群(23109592)联系我们开通了小程序码识别。 + * + */ + private List subResultsProgramCodeDataListList; + + + public Float rate; + + public String scene; + + /*** + * 图片中包含暴恐敏感内容时,返回识别出来的暴恐敏感信息。 + * + * 说明 仅适用于 terrorism 和 sface 场景。关于该参数在 sface 场景中的具体内容,请参见敏感人脸检测。 + * + */ + public java.util.List 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 faces; + } + +} \ No newline at end of file