欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-11-15 20:35:05
用 Java 实现“人像动漫化”特效参考此文档(python实现)效果展示不戴口罩的戴口罩的原理分析这里首先给大家提供下面的一个网址,这就是百度AI开放平台关于人像动漫化特效的网页:http://suo.im/64FNvD。在这里我们可以上传自己的图片(如图所示),进行人像动漫画的操作。在该页面有一个重要的东西:软件操作人像动漫化的接口(如图所示)。从左边可以看到,这是一个 Post 请求,发送该请求的网址并不全,需要你提供自己的access_to......

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

参考此文档(python实现) 

效果展示

不戴口罩的

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

 

戴口罩的

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

 原理分析

 

这里首先给大家提供下面的一个网址,这就是百度AI开放平台关于人像动漫化特效的网页:http://suo.im/64FNvD

在这里我们可以上传自己的图片(如图所示),进行人像动漫画的操作。

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

在该页面有一个重要的东西:软件操作人像动漫化的接口(如图所示)。从左边可以看到,这是一个 Post 请求,发送该请求的网址并不全,需要你提供自己的access_token。同时呢,发送 Post 请求不仅需要携带 Headers,还需要携带一个 Params 参数,其中 Headers 是固定的,image 参数是图片的 Base64 编码格式。该 Post 请求的返回值 Response 是一个字典,我们这里先记住就行了。

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

网址显示的页面中还有一个很重要的东西:人像动漫画接口的API文档(如图所示),该文档可以帮助我们怎么写代码

API文档网址:http://suo.im/64FNZ9

从图中可以看到,这个API文档中不仅有人像动漫画的操作,还有黑白图像上色、图像修复等一系列操作,都是很好玩的。希望大家学习了本文以后,能够下去玩玩其他的操作。

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

通过上述的原理分析:实现人像动漫画操作,最终就转化为发送一个 Post 请求。而发送 Post 请求呢,我们就需要获取我们的 Access_token 参数。

Access_token参数的获取

获取 Access_token 参数,需要使用百度的鉴权认证机制。下面就是鉴权认证机制的网址,在该网页上,详细介绍了我们怎么获取自己的 Access_token 参数。

鉴权认证机制网址:http://suo.im/6rUoTr

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

仔细查看本页面上的文档,我们可以很容易的发现:获取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 实现“人像动漫化”特效

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

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

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

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

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

 

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

 

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

点击展开后,我们可以查看某个 API 的使用次数。因为有些 API 接口并不是一直免费的,有效次数使用完了以后,需要付费使用啦。下图也可以看到人像动漫画操作大致也就500次的免费使用次数。

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

代码展示

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