@@ -0,0 +1,121 @@ | |||||
package me.chanjar.weixin.mp.api; | |||||
import me.chanjar.weixin.common.error.WxErrorException; | |||||
import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcAiCropResult; | |||||
import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcQrCodeResult; | |||||
import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcSuperResolutionResult; | |||||
import java.io.File; | |||||
/** | |||||
* 多项图像处理能力相关的API. | |||||
* https://developers.weixin.qq.com/doc/offiaccount/Intelligent_Interface/Img_Proc.html | |||||
* | |||||
* @author Theo Nie | |||||
*/ | |||||
public interface WxMpImgProcService { | |||||
/** | |||||
* 二维码/条码识别接口 | |||||
* 说明: | |||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 | |||||
* 2.文件大小限制:小于2M | |||||
* 3.支持条码、二维码、DataMatrix和PDF417的识别。 | |||||
* 4.二维码、DataMatrix会返回位置坐标,条码和PDF417暂不返回位置坐标。 | |||||
* | |||||
* @param imgUrl 图片url地址 | |||||
* @return WxMpImgProcQrCodeResult | |||||
* @throws WxErrorException . | |||||
*/ | |||||
WxMpImgProcQrCodeResult qrCode(String imgUrl) throws WxErrorException; | |||||
/** | |||||
* 二维码/条码识别接口 | |||||
* 说明: | |||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 | |||||
* 2.文件大小限制:小于2M | |||||
* 3.支持条码、二维码、DataMatrix和PDF417的识别。 | |||||
* 4.二维码、DataMatrix会返回位置坐标,条码和PDF417暂不返回位置坐标。 | |||||
* | |||||
* @param imgFile 图片文件对象 | |||||
* @return WxMpImgProcQrCodeResult | |||||
* @throws WxErrorException . | |||||
*/ | |||||
WxMpImgProcQrCodeResult qrCode(File imgFile) throws WxErrorException; | |||||
/** | |||||
* 图片高清化接口 | |||||
* 说明: | |||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 | |||||
* 2.文件大小限制:小于2M | |||||
* 3.目前支持将图片超分辨率高清化2倍,即生成图片分辨率为原图2倍大小 | |||||
* 返回的media_id有效期为3天,期间可以通过“获取临时素材”接口获取图片二进制 | |||||
* | |||||
* @param imgUrl 图片url地址 | |||||
* @return WxMpImgProcSuperResolutionResult | |||||
* @throws WxErrorException . | |||||
*/ | |||||
WxMpImgProcSuperResolutionResult superResolution(String imgUrl) throws WxErrorException; | |||||
/** | |||||
* 图片高清化接口 | |||||
* 说明: | |||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 | |||||
* 2.文件大小限制:小于2M | |||||
* 3.目前支持将图片超分辨率高清化2倍,即生成图片分辨率为原图2倍大小 | |||||
* 返回的media_id有效期为3天,期间可以通过“获取临时素材”接口获取图片二进制 | |||||
* | |||||
* @param imgFile 图片文件对象 | |||||
* @return WxMpImgProcSuperResolutionResult | |||||
* @throws WxErrorException . | |||||
*/ | |||||
WxMpImgProcSuperResolutionResult superResolution(File imgFile) throws WxErrorException; | |||||
/** | |||||
* 图片智能裁剪接口 | |||||
* 说明: | |||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 | |||||
* 2.文件大小限制:小于2M | |||||
* 3.该接口默认使用最佳宽高比 | |||||
* @param imgUrl 图片url地址 | |||||
* @return WxMpImgProcAiCropResult | |||||
* @throws WxErrorException . | |||||
*/ | |||||
WxMpImgProcAiCropResult aiCrop(String imgUrl) throws WxErrorException; | |||||
/** | |||||
* 图片智能裁剪接口 | |||||
* 说明: | |||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 | |||||
* 2.文件大小限制:小于2M | |||||
* @param imgUrl 图片url地址 | |||||
* @param ratios 宽高比,最多支持5个,请以英文逗号分隔 | |||||
* @return WxMpImgProcAiCropResult | |||||
* @throws WxErrorException . | |||||
*/ | |||||
WxMpImgProcAiCropResult aiCrop(String imgUrl, String ratios) throws WxErrorException; | |||||
/** | |||||
* 图片智能裁剪接口 | |||||
* 说明: | |||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 | |||||
* 2.文件大小限制:小于2M | |||||
* 3.该接口默认使用最佳宽高比 | |||||
* @param imgFile 图片文件对象 | |||||
* @return WxMpImgProcAiCropResult | |||||
* @throws WxErrorException . | |||||
*/ | |||||
WxMpImgProcAiCropResult aiCrop(File imgFile) throws WxErrorException; | |||||
/** | |||||
* 图片智能裁剪接口 | |||||
* 说明: | |||||
* 1.图片支持使用img参数实时上传,也支持使用img_url参数传送图片地址,由微信后台下载图片进行识别 | |||||
* 2.文件大小限制:小于2M | |||||
* @param imgFile 图片文件对象 | |||||
* @param ratios 宽高比,最多支持5个,请以英文逗号分隔 | |||||
* @return WxMpImgProcAiCropResult | |||||
* @throws WxErrorException . | |||||
*/ | |||||
WxMpImgProcAiCropResult aiCrop(File imgFile, String ratios) throws WxErrorException; | |||||
} |
@@ -522,6 +522,12 @@ public interface WxMpService { | |||||
*/ | */ | ||||
WxMpOcrService getOcrService(); | WxMpOcrService getOcrService(); | ||||
/** | |||||
* 返回图像处理接口的实现类对象,以方便调用其各个接口. | |||||
* @return WxMpImgProcService | |||||
*/ | |||||
WxMpImgProcService getImgProcService(); | |||||
/** | /** | ||||
* . | * . | ||||
* | * | ||||
@@ -648,6 +654,13 @@ public interface WxMpService { | |||||
*/ | */ | ||||
void setOcrService(WxMpOcrService ocrService); | void setOcrService(WxMpOcrService ocrService); | ||||
/** | |||||
* . | |||||
* | |||||
* @param imgProcService . | |||||
*/ | |||||
void setImgProcService(WxMpImgProcService imgProcService); | |||||
/** | /** | ||||
* 返回评论数据管理接口方法的实现类对象,以方便调用其各个接口. | * 返回评论数据管理接口方法的实现类对象,以方便调用其各个接口. | ||||
* | * | ||||
@@ -67,6 +67,7 @@ public abstract class BaseWxMpServiceImpl<H, P> implements WxMpService, RequestH | |||||
private WxMpMarketingService marketingService = new WxMpMarketingServiceImpl(this); | private WxMpMarketingService marketingService = new WxMpMarketingServiceImpl(this); | ||||
private WxMpCommentService commentService = new WxMpCommentServiceImpl(this); | private WxMpCommentService commentService = new WxMpCommentServiceImpl(this); | ||||
private WxMpOcrService ocrService = new WxMpOcrServiceImpl(this); | private WxMpOcrService ocrService = new WxMpOcrServiceImpl(this); | ||||
private WxMpImgProcService imgProcService = new WxMpImgProcServiceImpl(this); | |||||
private Map<String, WxMpConfigStorage> configStorageMap; | private Map<String, WxMpConfigStorage> configStorageMap; | ||||
@@ -647,4 +648,14 @@ public abstract class BaseWxMpServiceImpl<H, P> implements WxMpService, RequestH | |||||
public void setCommentService(WxMpCommentService commentService) { | public void setCommentService(WxMpCommentService commentService) { | ||||
this.commentService = commentService; | this.commentService = commentService; | ||||
} | } | ||||
@Override | |||||
public WxMpImgProcService getImgProcService() { | |||||
return this.imgProcService; | |||||
} | |||||
@Override | |||||
public void setImgProcService(WxMpImgProcService imgProcService) { | |||||
this.imgProcService = imgProcService; | |||||
} | |||||
} | } |
@@ -0,0 +1,104 @@ | |||||
package me.chanjar.weixin.mp.api.impl; | |||||
import lombok.RequiredArgsConstructor; | |||||
import me.chanjar.weixin.common.error.WxErrorException; | |||||
import me.chanjar.weixin.mp.api.WxMpImgProcService; | |||||
import me.chanjar.weixin.mp.api.WxMpService; | |||||
import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcAiCropResult; | |||||
import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcQrCodeResult; | |||||
import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcSuperResolutionResult; | |||||
import me.chanjar.weixin.mp.util.requestexecuter.ocr.OcrDiscernRequestExecutor; | |||||
import org.apache.commons.lang3.StringUtils; | |||||
import java.io.File; | |||||
import java.io.UnsupportedEncodingException; | |||||
import java.net.URLEncoder; | |||||
import java.nio.charset.StandardCharsets; | |||||
import static me.chanjar.weixin.mp.enums.WxMpApiUrl.ImgProc.AI_CROP; | |||||
import static me.chanjar.weixin.mp.enums.WxMpApiUrl.ImgProc.FILE_AI_CROP; | |||||
import static me.chanjar.weixin.mp.enums.WxMpApiUrl.ImgProc.FILE_QRCODE; | |||||
import static me.chanjar.weixin.mp.enums.WxMpApiUrl.ImgProc.FILE_SUPER_RESOLUTION; | |||||
import static me.chanjar.weixin.mp.enums.WxMpApiUrl.ImgProc.QRCODE; | |||||
import static me.chanjar.weixin.mp.enums.WxMpApiUrl.ImgProc.SUPER_RESOLUTION; | |||||
/** | |||||
* 图像处理接口实现. | |||||
* @author Theo Nie | |||||
*/ | |||||
@RequiredArgsConstructor | |||||
public class WxMpImgProcServiceImpl implements WxMpImgProcService { | |||||
private final WxMpService wxMpService; | |||||
@Override | |||||
public WxMpImgProcQrCodeResult qrCode(String imgUrl) throws WxErrorException { | |||||
try { | |||||
imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); | |||||
} catch (UnsupportedEncodingException e) { | |||||
//ignore | |||||
} | |||||
final String result = this.wxMpService.get(String.format(QRCODE.getUrl(this.wxMpService.getWxMpConfigStorage()), imgUrl), null); | |||||
return WxMpImgProcQrCodeResult.fromJson(result); | |||||
} | |||||
@Override | |||||
public WxMpImgProcQrCodeResult qrCode(File imgFile) throws WxErrorException { | |||||
String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), FILE_QRCODE.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile); | |||||
return WxMpImgProcQrCodeResult.fromJson(result); | |||||
} | |||||
@Override | |||||
public WxMpImgProcSuperResolutionResult superResolution(String imgUrl) throws WxErrorException { | |||||
try { | |||||
imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); | |||||
} catch (UnsupportedEncodingException e) { | |||||
//ignore | |||||
} | |||||
final String result = this.wxMpService.get(String.format(SUPER_RESOLUTION.getUrl(this.wxMpService.getWxMpConfigStorage()), imgUrl), null); | |||||
return WxMpImgProcSuperResolutionResult.fromJson(result); | |||||
} | |||||
@Override | |||||
public WxMpImgProcSuperResolutionResult superResolution(File imgFile) throws WxErrorException { | |||||
String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), FILE_SUPER_RESOLUTION.getUrl(this.wxMpService.getWxMpConfigStorage()), imgFile); | |||||
return WxMpImgProcSuperResolutionResult.fromJson(result); | |||||
} | |||||
@Override | |||||
public WxMpImgProcAiCropResult aiCrop(String imgUrl) throws WxErrorException { | |||||
return this.aiCrop(imgUrl, ""); | |||||
} | |||||
@Override | |||||
public WxMpImgProcAiCropResult aiCrop(String imgUrl, String ratios) throws WxErrorException { | |||||
try { | |||||
imgUrl = URLEncoder.encode(imgUrl, StandardCharsets.UTF_8.name()); | |||||
} catch (UnsupportedEncodingException e) { | |||||
//ignore | |||||
} | |||||
if (StringUtils.isEmpty(ratios)) { | |||||
ratios = ""; | |||||
} | |||||
final String result = this.wxMpService.get(String.format(AI_CROP.getUrl(this.wxMpService.getWxMpConfigStorage()), imgUrl, ratios), null); | |||||
return WxMpImgProcAiCropResult.fromJson(result); | |||||
} | |||||
@Override | |||||
public WxMpImgProcAiCropResult aiCrop(File imgFile) throws WxErrorException { | |||||
return this.aiCrop(imgFile, ""); | |||||
} | |||||
@Override | |||||
public WxMpImgProcAiCropResult aiCrop(File imgFile, String ratios) throws WxErrorException { | |||||
if (StringUtils.isEmpty(ratios)) { | |||||
ratios = ""; | |||||
} | |||||
String result = this.wxMpService.execute(OcrDiscernRequestExecutor.create(this.wxMpService.getRequestHttp()), String.format(FILE_AI_CROP.getUrl(this.wxMpService.getWxMpConfigStorage()), ratios), imgFile); | |||||
return WxMpImgProcAiCropResult.fromJson(result); | |||||
} | |||||
} |
@@ -0,0 +1,60 @@ | |||||
package me.chanjar.weixin.mp.bean.imgproc; | |||||
import com.google.gson.annotations.SerializedName; | |||||
import lombok.Data; | |||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||||
import java.io.Serializable; | |||||
import java.util.List; | |||||
/** | |||||
* @author Theo Nie | |||||
*/ | |||||
@Data | |||||
public class WxMpImgProcAiCropResult implements Serializable { | |||||
private static final long serialVersionUID = -6470673963772979463L; | |||||
@SerializedName("img_size") | |||||
private ImgSize imgSize; | |||||
@SerializedName("results") | |||||
private List<Results> results; | |||||
@Override | |||||
public String toString() { | |||||
return WxMpGsonBuilder.create().toJson(this); | |||||
} | |||||
public static WxMpImgProcAiCropResult fromJson(String json) { | |||||
return WxMpGsonBuilder.create().fromJson(json, WxMpImgProcAiCropResult.class); | |||||
} | |||||
@Data | |||||
public static class ImgSize { | |||||
@SerializedName("w") | |||||
private int w; | |||||
@SerializedName("h") | |||||
private int h; | |||||
@Override | |||||
public String toString() { | |||||
return WxMpGsonBuilder.create().toJson(this); | |||||
} | |||||
} | |||||
@Data | |||||
public static class Results { | |||||
@SerializedName("crop_left") | |||||
private int cropLeft; | |||||
@SerializedName("crop_top") | |||||
private int cropTop; | |||||
@SerializedName("crop_right") | |||||
private int cropRight; | |||||
@SerializedName("crop_bottom") | |||||
private int cropBottom; | |||||
@Override | |||||
public String toString() { | |||||
return WxMpGsonBuilder.create().toJson(this); | |||||
} | |||||
} | |||||
} |
@@ -0,0 +1,93 @@ | |||||
package me.chanjar.weixin.mp.bean.imgproc; | |||||
import com.google.gson.annotations.SerializedName; | |||||
import lombok.Data; | |||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||||
import java.io.Serializable; | |||||
import java.util.List; | |||||
/** | |||||
* 二维码/条码识别返回结果 | |||||
* @author Theo Nie | |||||
*/ | |||||
@Data | |||||
public class WxMpImgProcQrCodeResult implements Serializable { | |||||
private static final long serialVersionUID = -1194154790100866123L; | |||||
@SerializedName("img_size") | |||||
private ImgSize imgSize; | |||||
@SerializedName("code_results") | |||||
private List<CodeResults> codeResults; | |||||
@Data | |||||
public static class ImgSize implements Serializable{ | |||||
private static final long serialVersionUID = -8847603245514017839L; | |||||
@SerializedName("w") | |||||
private int w; | |||||
@SerializedName("h") | |||||
private int h; | |||||
@Override | |||||
public String toString() { | |||||
return WxMpGsonBuilder.create().toJson(this); | |||||
} | |||||
} | |||||
@Data | |||||
public static class CodeResults implements Serializable{ | |||||
private static final long serialVersionUID = -6138135951229076759L; | |||||
@SerializedName("type_name") | |||||
private String typeName; | |||||
@SerializedName("data") | |||||
private String data; | |||||
@SerializedName("pos") | |||||
private Pos pos; | |||||
@Override | |||||
public String toString() { | |||||
return WxMpGsonBuilder.create().toJson(this); | |||||
} | |||||
@Data | |||||
public static class Pos implements Serializable{ | |||||
private static final long serialVersionUID = 7754894061212819602L; | |||||
@SerializedName("left_top") | |||||
private Coordinate leftTop; | |||||
@SerializedName("right_top") | |||||
private Coordinate rightTop; | |||||
@SerializedName("right_bottom") | |||||
private Coordinate rightBottom; | |||||
@SerializedName("left_bottom") | |||||
private Coordinate leftBottom; | |||||
@Override | |||||
public String toString() { | |||||
return WxMpGsonBuilder.create().toJson(this); | |||||
} | |||||
@Data | |||||
public static class Coordinate implements Serializable{ | |||||
private static final long serialVersionUID = 8930443668927359677L; | |||||
@SerializedName("x") | |||||
private int x; | |||||
@SerializedName("y") | |||||
private int y; | |||||
@Override | |||||
public String toString() { | |||||
return WxMpGsonBuilder.create().toJson(this); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
public static WxMpImgProcQrCodeResult fromJson(String json) { | |||||
return WxMpGsonBuilder.create().fromJson(json, WxMpImgProcQrCodeResult.class); | |||||
} | |||||
@Override | |||||
public String toString() { | |||||
return WxMpGsonBuilder.create().toJson(this); | |||||
} | |||||
} |
@@ -0,0 +1,28 @@ | |||||
package me.chanjar.weixin.mp.bean.imgproc; | |||||
import com.google.gson.annotations.SerializedName; | |||||
import lombok.Data; | |||||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||||
import java.io.Serializable; | |||||
/** | |||||
* 图片高清化返回结果 | |||||
* @author Theo Nie | |||||
*/ | |||||
@Data | |||||
public class WxMpImgProcSuperResolutionResult implements Serializable { | |||||
private static final long serialVersionUID = 8007440280170407021L; | |||||
@SerializedName("media_id") | |||||
private String mediaId; | |||||
@Override | |||||
public String toString() { | |||||
return WxMpGsonBuilder.create().toJson(this); | |||||
} | |||||
public static WxMpImgProcSuperResolutionResult fromJson(String json) { | |||||
return WxMpGsonBuilder.create().fromJson(json, WxMpImgProcSuperResolutionResult.class); | |||||
} | |||||
} |
@@ -954,4 +954,49 @@ public interface WxMpApiUrl { | |||||
return buildUrl(config.getHostConfig(), prefix, path); | return buildUrl(config.getHostConfig(), prefix, path); | ||||
} | } | ||||
} | } | ||||
@AllArgsConstructor | |||||
enum ImgProc implements WxMpApiUrl { | |||||
/** | |||||
* 二维码/条码识别 | |||||
*/ | |||||
QRCODE(API_DEFAULT_HOST_URL, "/cv/img/qrcode?img_url=%s"), | |||||
/** | |||||
* 二维码/条码识别(文件) | |||||
*/ | |||||
FILE_QRCODE(API_DEFAULT_HOST_URL, "/cv/img/qrcode"), | |||||
/** | |||||
* 图片高清化 | |||||
*/ | |||||
SUPER_RESOLUTION(API_DEFAULT_HOST_URL, "/cv/img/superresolution?img_url=%s"), | |||||
/** | |||||
* 图片高清化(文件) | |||||
*/ | |||||
FILE_SUPER_RESOLUTION(API_DEFAULT_HOST_URL, "/cv/img/superresolution"), | |||||
/** | |||||
* 图片智能裁剪 | |||||
*/ | |||||
AI_CROP(API_DEFAULT_HOST_URL, "/cv/img/aicrop?img_url=%s&ratios=%s"), | |||||
/** | |||||
* 图片智能裁剪(文件) | |||||
*/ | |||||
FILE_AI_CROP(API_DEFAULT_HOST_URL, "/cv/img/aicrop?ratios=%s"); | |||||
private String prefix; | |||||
private String path; | |||||
@Override | |||||
public String getUrl(WxMpConfigStorage config) { | |||||
if (null == config) { | |||||
return buildUrl(null, prefix, path); | |||||
} | |||||
return buildUrl(config.getHostConfig(), prefix, path); | |||||
} | |||||
} | |||||
} | } |
@@ -0,0 +1,213 @@ | |||||
package me.chanjar.weixin.mp.api.impl; | |||||
import me.chanjar.weixin.common.error.WxErrorException; | |||||
import me.chanjar.weixin.common.util.fs.FileUtils; | |||||
import me.chanjar.weixin.mp.api.WxMpImgProcService; | |||||
import me.chanjar.weixin.mp.api.WxMpService; | |||||
import me.chanjar.weixin.mp.api.test.ApiTestModule; | |||||
import me.chanjar.weixin.mp.api.test.TestConstants; | |||||
import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcAiCropResult; | |||||
import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcQrCodeResult; | |||||
import me.chanjar.weixin.mp.bean.imgproc.WxMpImgProcSuperResolutionResult; | |||||
import org.testng.annotations.Guice; | |||||
import org.testng.annotations.Test; | |||||
import javax.inject.Inject; | |||||
import java.io.File; | |||||
import java.io.InputStream; | |||||
import java.util.UUID; | |||||
import static org.assertj.core.api.Assertions.assertThat; | |||||
import static org.mockito.Mockito.*; | |||||
@Test | |||||
@Guice(modules = ApiTestModule.class) | |||||
public class WxMpImgProcServiceImplTest { | |||||
@Inject | |||||
private WxMpService mpService; | |||||
@Test | |||||
public void testQrCode() throws WxErrorException { | |||||
final WxMpImgProcQrCodeResult result = this.mpService.getImgProcService().qrCode("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png"); | |||||
assertThat(result).isNotNull(); | |||||
System.out.println(result); | |||||
} | |||||
@Test | |||||
public void testQrCode2() throws Exception { | |||||
InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); | |||||
File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); | |||||
final WxMpImgProcQrCodeResult result = this.mpService.getImgProcService().qrCode(tempFile); | |||||
assertThat(result).isNotNull(); | |||||
System.out.println(result); | |||||
} | |||||
@Test | |||||
public void testSuperResolution() throws WxErrorException { | |||||
final WxMpImgProcSuperResolutionResult result = this.mpService.getImgProcService().superResolution("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png"); | |||||
assertThat(result).isNotNull(); | |||||
System.out.println(result); | |||||
} | |||||
@Test | |||||
public void testSuperResolution2() throws Exception { | |||||
InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); | |||||
File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); | |||||
final WxMpImgProcSuperResolutionResult result = this.mpService.getImgProcService().superResolution(tempFile); | |||||
assertThat(result).isNotNull(); | |||||
System.out.println(result); | |||||
} | |||||
@Test | |||||
public void testAiCrop() throws WxErrorException { | |||||
final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png"); | |||||
assertThat(result).isNotNull(); | |||||
System.out.println(result); | |||||
} | |||||
@Test | |||||
public void testAiCrop2() throws WxErrorException { | |||||
final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop("https://gitee.com/binary/weixin-java-tools/raw/master/images/qrcodes/mp.png", "1,2.35"); | |||||
assertThat(result).isNotNull(); | |||||
System.out.println(result); | |||||
} | |||||
@Test | |||||
public void testAiCrop3() throws Exception { | |||||
InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); | |||||
File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); | |||||
final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop(tempFile); | |||||
assertThat(result).isNotNull(); | |||||
System.out.println(result); | |||||
} | |||||
@Test | |||||
public void testAiCrop4() throws Exception { | |||||
InputStream inputStream = ClassLoader.getSystemResourceAsStream("mm.jpeg"); | |||||
File tempFile = FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), TestConstants.FILE_JPG); | |||||
final WxMpImgProcAiCropResult result = this.mpService.getImgProcService().aiCrop(tempFile, "1,2.35,3.5"); | |||||
assertThat(result).isNotNull(); | |||||
System.out.println(result); | |||||
} | |||||
public static class mockTest { | |||||
private WxMpService wxService = mock(WxMpService.class); | |||||
@Test | |||||
public void testQrCode() throws Exception { | |||||
String returnJson = "{\n" + | |||||
" \"errcode\": 0, \n" + | |||||
" \"errmsg\": \"ok\", \n" + | |||||
" \"code_results\": [\n" + | |||||
" {\n" + | |||||
" \"type_name\": \"QR_CODE\", \n" + | |||||
" \"data\": \"https://www.qq.com\", \n" + | |||||
" \"pos\": {\n" + | |||||
" \"left_top\": {\n" + | |||||
" \"x\": 585, \n" + | |||||
" \"y\": 378\n" + | |||||
" }, \n" + | |||||
" \"right_top\": {\n" + | |||||
" \"x\": 828, \n" + | |||||
" \"y\": 378\n" + | |||||
" }, \n" + | |||||
" \"right_bottom\": {\n" + | |||||
" \"x\": 828, \n" + | |||||
" \"y\": 618\n" + | |||||
" }, \n" + | |||||
" \"left_bottom\": {\n" + | |||||
" \"x\": 585, \n" + | |||||
" \"y\": 618\n" + | |||||
" }\n" + | |||||
" }\n" + | |||||
" }, \n" + | |||||
" {\n" + | |||||
" \"type_name\": \"QR_CODE\", \n" + | |||||
" \"data\": \"https://mp.weixin.qq.com\", \n" + | |||||
" \"pos\": {\n" + | |||||
" \"left_top\": {\n" + | |||||
" \"x\": 185, \n" + | |||||
" \"y\": 142\n" + | |||||
" }, \n" + | |||||
" \"right_top\": {\n" + | |||||
" \"x\": 396, \n" + | |||||
" \"y\": 142\n" + | |||||
" }, \n" + | |||||
" \"right_bottom\": {\n" + | |||||
" \"x\": 396, \n" + | |||||
" \"y\": 353\n" + | |||||
" }, \n" + | |||||
" \"left_bottom\": {\n" + | |||||
" \"x\": 185, \n" + | |||||
" \"y\": 353\n" + | |||||
" }\n" + | |||||
" }\n" + | |||||
" }, \n" + | |||||
" {\n" + | |||||
" \"type_name\": \"EAN_13\", \n" + | |||||
" \"data\": \"5906789678957\"\n" + | |||||
" }, \n" + | |||||
" {\n" + | |||||
" \"type_name\": \"CODE_128\", \n" + | |||||
" \"data\": \"50090500019191\"\n" + | |||||
" }\n" + | |||||
" ], \n" + | |||||
" \"img_size\": {\n" + | |||||
" \"w\": 1000, \n" + | |||||
" \"h\": 900\n" + | |||||
" }\n" + | |||||
"}"; | |||||
when(wxService.get(anyString(), anyString())).thenReturn(returnJson); | |||||
final WxMpImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService); | |||||
final WxMpImgProcQrCodeResult result = wxMpImgProcService.qrCode("abc"); | |||||
assertThat(result).isNotNull(); | |||||
System.out.println(result); | |||||
} | |||||
@Test | |||||
public void testSuperResolution() throws Exception { | |||||
String returnJson = "{\n" + | |||||
" \"errcode\": 0, \n" + | |||||
" \"errmsg\": \"ok\", \n" + | |||||
" \"media_id\": \"6WXsIXkG7lXuDLspD9xfm5dsvHzb0EFl0li6ySxi92ap8Vl3zZoD9DpOyNudeJGB\"\n" + | |||||
"}"; | |||||
when(wxService.get(anyString(), anyString())).thenReturn(returnJson); | |||||
final WxMpImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService); | |||||
final WxMpImgProcSuperResolutionResult result = wxMpImgProcService.superResolution("abc"); | |||||
assertThat(result).isNotNull(); | |||||
System.out.println(result); | |||||
} | |||||
@Test | |||||
public void testAiCrop() throws Exception { | |||||
String returnJson = "{\n" + | |||||
" \"errcode\": 0, \n" + | |||||
" \"errmsg\": \"ok\", \n" + | |||||
" \"results\": [ //智能裁剪结果\n" + | |||||
" {\n" + | |||||
" \"crop_left\": 112, \n" + | |||||
" \"crop_top\": 0, \n" + | |||||
" \"crop_right\": 839, \n" + | |||||
" \"crop_bottom\": 727\n" + | |||||
" }, \n" + | |||||
" {\n" + | |||||
" \"crop_left\": 0, \n" + | |||||
" \"crop_top\": 205, \n" + | |||||
" \"crop_right\": 965, \n" + | |||||
" \"crop_bottom\": 615\n" + | |||||
" }\n" + | |||||
" ], \n" + | |||||
" \"img_size\": { //图片大小\n" + | |||||
" \"w\": 966, \n" + | |||||
" \"h\": 728\n" + | |||||
" }\n" + | |||||
"}"; | |||||
when(wxService.get(anyString(), anyString())).thenReturn(returnJson); | |||||
final WxMpImgProcService wxMpImgProcService = new WxMpImgProcServiceImpl(wxService); | |||||
final WxMpImgProcAiCropResult result = wxMpImgProcService.aiCrop("abc"); | |||||
assertThat(result).isNotNull(); | |||||
System.out.println(result); | |||||
} | |||||
} | |||||
} |