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

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

参考此文档(python实现) 

效果展示

不戴口罩的

用 Java 实现“人像动漫化”特效_第1张图片用 Java 实现“人像动漫化”特效_第2张图片

 

戴口罩的

用 Java 实现“人像动漫化”特效_第3张图片用 Java 实现“人像动漫化”特效_第4张图片

 原理分析

 

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

用 Java 实现“人像动漫化”特效_第5张图片

当出现如下页面,我们点击应用列表。

当出现如下界面,完成如下的操作

 

创建成功后,直接查看应用列表即可,最终页面如下。

 

点击展开后,我们可以查看某个 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;
    }
}

 

 

 

 

 

 

 

 

你可能感兴趣的:(AI图片增强(百度),java)