用 Java 实现“人像动漫化”特效

您所在的位置:网站首页 简单像素图片卡通图片 用 Java 实现“人像动漫化”特效

用 Java 实现“人像动漫化”特效

2024-02-24 18:33| 来源: 网络整理| 查看: 265

用 Java 实现“人像动漫化”特效

参考此文档(python实现) 

效果展示

不戴口罩的

 

戴口罩的

 原理分析

 

这里首先给大家提供下面的一个网址,这就是百度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; } }

 

 

 

 

 

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3