用 Java 实现“人像动漫化”特效
用 Java 实现“人像动漫化”特效
效果展示
不戴口罩的
戴口罩的
原理分析
这里首先给大家提供下面的一个网址,这就是百度AI开放平台关于人像动漫化特效的网页:http://suo.im/64FNvD。
在这里我们可以上传自己的图片(如图所示),进行人像动漫画的操作。
在该页面有一个重要的东西:软件操作人像动漫化的接口(如图所示)。从左边可以看到,这是一个 Post 请求,发送该请求的网址并不全,需要你提供自己的access_token。同时呢,发送 Post 请求不仅需要携带 Headers,还需要携带一个 Params 参数,其中 Headers 是固定的,image 参数是图片的 Base64 编码格式。该 Post 请求的返回值 Response 是一个字典,我们这里先记住就行了。
网址显示的页面中还有一个很重要的东西:人像动漫画接口的API文档(如图所示),该文档可以帮助我们怎么写代码
API文档网址:http://suo.im/64FNZ9
从图中可以看到,这个API文档中不仅有人像动漫画的操作,还有黑白图像上色、图像修复等一系列操作,都是很好玩的。希望大家学习了本文以后,能够下去玩玩其他的操作。
通过上述的原理分析:实现人像动漫画操作,最终就转化为发送一个 Post 请求。而发送 Post 请求呢,我们就需要获取我们的 Access_token 参数。
Access_token参数的获取
获取 Access_token 参数,需要使用百度的鉴权认证机制。下面就是鉴权认证机制的网址,在该网页上,详细介绍了我们怎么获取自己的 Access_token 参数。
鉴权认证机制网址:http://suo.im/6rUoTr
仔细查看本页面上的文档,我们可以很容易的发现:获取Access_token 参数,就是是发送一次 Post 请求,该请求的返回值是一个字典,里面有我们想要获取的access_token参数。
https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=【官网获取的AK】&client_secret=【官网获取的SK】
上面是这个 Post 请求的网址,但是可以看到这个网址也是不全的,它还需要我们在官网中获取到自己的【官网获取的AK】和【官网获取的SK】,其中 AK 指的是 API Key,SK 指的是 Secret Key。
通过上述的分析:为了获取 Access_token 参数,也是发送一个 Post 请求,而发送 Post 请求,就需要我们找到自己的 API Key 和 Secret Key。
寻找API Key和Secret Key
当出现如下页面,我们点击应用列表。
当出现如下界面,完成如下的操作
创建成功后,直接查看应用列表即可,最终页面如下。
点击展开后,我们可以查看某个 API 的使用次数。因为有些 API 接口并不是一直免费的,有效次数使用完了以后,需要付费使用啦。下图也可以看到人像动漫画操作大致也就500次的免费使用次数。
代码展示
1)单纯的人像动漫化,不为人像戴口罩
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.innshine.face.utils.Base64Util;
import com.innshine.face.utils.FileUtil;
import com.innshine.face.utils.HttpUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
/**
* 重要提示代码中所需工具类
* FileUtil,Base64Util,HttpUtil,GsonUtils请从
* https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
* https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
* https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
* https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
* 下载
*/
@RestController
public class BaiDuFaceController {
@RequestMapping("/get/picture")
public String getPictureSource() {
/**
* 获取access_token
*/
String CLIENT_ID = "3j8EWb6rgg...SPY2X693LBy";
String CLIENT_SECRET = "Px9KZuU0Gl...jTKktoCopnIWEiF57gf";
String getAccessTokenUrl = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + CLIENT_ID + "&client_secret=" + CLIENT_SECRET;
String access_token="";
String result = "";
String line;
String response="";
try {
URL realUrl = new URL(getAccessTokenUrl);
// 打开和URL之间的连接
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("GET");
connection.connect();
// 定义 BufferedReader输入流来读取URL的响应
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while ((line = in.readLine()) != null) {
result += line;
}
/**
* 返回结果
*/
JSONObject jsonObject = JSON.parseObject(result);
access_token = jsonObject.getString("access_token");
/**
* 请求图片处理接口
*/
String postUrl = "https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime";
// 本地文件路径
String filePath = "D:\\meinv.jpg";
byte[] imgData = FileUtil.readFileByBytes(filePath);
String imgStr = Base64Util.encode(imgData);
String imgParam = URLEncoder.encode(imgStr, "UTF-8");
//不戴口罩的参数
String param = "image=" + imgParam ;
response = HttpUtil.post(postUrl, access_token, param);
JSONObject parseObject = JSON.parseObject(response);
String image = parseObject.getString("image");
Base64Util.GenerateImage(image,"D:\\meinv(20).jpg");
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
}
2)人像动漫化,并为人像戴口罩
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.innshine.face.utils.Base64Util;
import com.innshine.face.utils.FileUtil;
import com.innshine.face.utils.HttpUtil;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.*;
@RestController
public class BaiDuFaceController {
@RequestMapping("/get/picture")
public String getPictureSource() {
/**
* 获取access_token
*/
String CLIENT_ID = "3j8EWb6rgg...SPY2X693LBy";
String CLIENT_SECRET = "Px9KZuU0Gl...jTKktoCopnIWEiF57gf";
String getAccessTokenUrl = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + CLIENT_ID + "&client_secret=" + CLIENT_SECRET;
String access_token="";
String result = "";
String line;
String response="";
try {
URL realUrl = new URL(getAccessTokenUrl);
// 打开和URL之间的连接
HttpURLConnection connection = (HttpURLConnection) realUrl.openConnection();
connection.setRequestMethod("GET");
connection.connect();
// 定义 BufferedReader输入流来读取URL的响应
BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while ((line = in.readLine()) != null) {
result += line;
}
/**
* 返回结果
*/
JSONObject jsonObject = JSON.parseObject(result);
access_token = jsonObject.getString("access_token");
/**
* 请求图片处理接口
*/
String postUrl = "https://aip.baidubce.com/rest/2.0/image-process/v1/selfie_anime";
// 本地文件路径
String filePath = "D:\\meinv.jpg";
byte[] imgData = FileUtil.readFileByBytes(filePath);
String imgStr = Base64Util.encode(imgData);
String imgParam = URLEncoder.encode(imgStr, "UTF-8");
//戴口罩参数 参数格式 key=value&key01=value01....
String param = "image=" + imgParam + "&type=anime_mask&mask_id=2";
response = HttpUtil.post(postUrl, access_token, param);
JSONObject parseObject = JSON.parseObject(response);
String image = parseObject.getString("image");
Base64Util.GenerateImage(image,"D:\\meinv(20).jpg");
} catch (Exception e) {
e.printStackTrace();
}
return response;
}
}
本文地址:https://blog.csdn.net/qq_36349616/article/details/107367243