在調合合AI平臺提供的圖片美化加強API接口,API平臺連接:https://ai.ccint.com/doc/api/crop_enhance_image, 由於有遇到一些問題,寫篇博客記錄一下java
API文檔提供的說明: url中參數app_key爲我的中心實例的app_keyapache
請求方式: POSTjson
返回類型: JSONapi
POST BODY請求字段描述服務器
字段 | 說明 |
---|---|
image_data | 必填,圖像的base64串 |
app_secret | 必填,我的中心實例的app_secret |
scan-m | 掃描模式, 建議爲 1 |
detail | 銳化程度,建議爲-1 |
contrast | 對比度 ,建議爲 0 |
bright | 增亮 ,建議爲 0 |
enhanceMode | 加強模式,1:增亮,2:加強並銳化,3:黑白,4:灰度 |
POST BODY,接口要求以Post body方式發送,由於要傳base64字符串,請求參數過長有400錯誤的app
{ "image_data": "", // 必填,圖像的base64串 "app_secret": "" // 必填,我的中心實例的app_secret "scan-m": 1, //掃描模式, 建議爲 1 "detail": -1, //銳化程度,建議爲-1 "contrast": 0, //對比度 ,建議爲 0 "bright": 0, //增亮 ,建議爲 0 "enhanceMode": 0 //加強模式,1:增亮,2:加強並銳化,3:黑白,4:灰度 }
提示:POST BODY 爲 JSON字符串。工具
返回字段描述編碼
字段 | 說明 |
---|---|
code | 返回狀態碼。200:正常返回; 500:服務器內部錯誤 |
message | 返回對應code的狀態說明 |
result | base64編碼的圖片信息 |
正常返回示例url
{ "code": 200, "message": "success", "result": 「圖片base64信息」 }
失敗返回示例.net
{ "code":30301, "message":"額度已用完,請充值後使用" }
返回碼說明
API文檔提供的實例代碼:
import sun.misc.BASE64Encoder; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; public class Main { public static void main(String[] args) throws Exception { String url = "https://ocr-api.ccint.com/ocr_service?app_key=%s"; String appKey = "xxxxxx"; // your app_key String appSecret = "xxxxxx"; // your app_secret url = String.format(url, appKey); OutputStreamWriter out = null; BufferedReader in = null; String result = ""; try { String imgData = imageToBase64("example.jpg"); String param="{\"app_secret\":\"%s\",\"image_data\":\"%s\"}"; param=String.format(param,appSecret,imgData); URL realUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection(); conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestMethod("POST"); // 設置請求方式 conn.setRequestProperty("Content-Type", "application/json"); // 設置發送數據的 conn.connect(); out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); out.append(param); out.flush(); out.close(); in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("發送 POST 請求出現異常!" + e); e.printStackTrace(); } finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } System.out.println(result); } public static String imageToBase64(String path) { String imgFile = path; InputStream in = null; byte[] data = null; try { in = new FileInputStream(imgFile); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data); } }
注意要點:
/** * 圖片切邊加強接口調用 * @author nicky.ma * @date 2019年5月20日下午3:44:27 * @param scanM 掃描模式, 建議爲 1 * @param bright 增亮 ,建議爲 0 * @param contrast 對比度 ,建議爲 0 * @param detail 銳化程度,建議爲-1 * @param sourcePath * @param destPath * detail=0&contrast=0&bright=50 增到最亮 * @return */ public static void ccintCropEnhanceHttpService(final int scanM,final int bright,final int contrast, final int detail,final int enhanceMode,String sourcePath,String destPath) throws Exception{ logger.info("sourcePath:{}"+sourcePath); logger.info("destPath:{}"+destPath); //base64轉換 final String imgData = imageToBase64(sourcePath); Map<String,Object> paramsMap=new HashMap<String,Object>(){ private static final long serialVersionUID=1L; { put("image_data",imgData); put("app_secret",CCINT_APP_SECRET); put("scan-m",scanM); put("detail",detail); put("contrast",contrast); put("bright",bright); put("enhanceMode",enhanceMode); }}; String param = JSON.toJSONString(paramsMap); // String param="{\"app_secret\":\"%s\",\"image_data\":\"%s\",\"scan-m\":\"%s\",\"detail\":\"%s\",\"contrast\":\"%s\",\"bright\":\"%s\",\"enhanceMode\":\"%s\"}"; // param=String.format(param,CCINT_APP_SECRET,imgData,scanM,detail,contrast,bright,enhanceMode); String url = CCINT_CROP_ENHANCE_URL+"?app_key="+CCINT_APP_KEY; OutputStreamWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) realUrl.openConnection(); conn.setConnectTimeout(20*1000); conn.setReadTimeout(20*1000); conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); conn.setDoOutput(true); conn.setDoInput(true); conn.setRequestMethod("POST"); // 設置請求方式 //conn.setRequestProperty("transfer-encoding","chunked"); conn.setRequestProperty("Content-Type", "application/json"); // 設置發送數據的 conn.connect(); out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); out.append(param); //要記得flush,才能拿到數據 out.flush(); out.close(); in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } logger.info("返回Result:{}"+result); int code=conn.getResponseCode(); if(code==200){ JSONObject obj = JSON.parseObject(result); // copyFileByInputStream(conn.getInputStream(),destPath); FileBase64Util.decoderBase64File(obj.getString("result"), destPath); logger.info("圖片加強後文件大小:{}"+new File(destPath).length()/1024+"KB"); } conn.disconnect(); } catch (Exception e) { logger.error("AI平臺接口調用異常:{}"+e); e.printStackTrace(); }finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { ex.printStackTrace(); } } } private static String imageToBase64(String path) { String imgFile = path; InputStream in = null; byte[] data = null; try { in = new FileInputStream(imgFile); data = new byte[in.available()]; in.read(data); in.close(); } catch (IOException e) { e.printStackTrace(); } BASE64Encoder encoder = new BASE64Encoder(); return encoder.encode(data); }
base64字符串和文件轉換工具類:
import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.commons.codec.binary.Base64; public class FileBase64Util{ /** * 將文件轉成base64 字符串 * @param path文件路徑 * @return * @throws Exception */ public static String encodeBase64File(String path) throws Exception { File file = new File(path); FileInputStream inputFile = new FileInputStream(file); byte[] buffer = new byte[(int) file.length()]; inputFile.read(buffer); inputFile.close(); return Base64.encodeBase64String(buffer); } /** * 將base64字符解碼保存文件 * @param base64String * @param targetPath * @throws Exception */ public static void decoderBase64File(String base64String, String targetPath)throws Exception { byte[] buffer=Base64.decodeBase64(base64String); FileOutputStream out = new FileOutputStream(targetPath); out.write(buffer); out.close(); } /** * 將base64字符保存文本文件 * @param base64Code * @param targetPath * @throws Exception */ public static void toFile(String base64Code, String targetPath)throws Exception { byte[] buffer=base64Code.getBytes(); FileOutputStream out = new FileOutputStream(targetPath); out.write(buffer); out.close(); } public static void main(String[] args){ try{ String base64String=${base64字符串}; decoderBase64File(encodeBase64File("d://2018-11-27 14_34_28_reject_dq.pdf"),"D:/2.pdf"); }catch(Exception e){ e.printStackTrace(); } } }