最近百度推出了一款“百度AI图片助手”的工具很是好用,向我们常用的画质修复功能、去除水印功能,AI扩图功能都非常好用,对于我们处理图片很有帮助。但是比较鸡肋的是只能在百度搜索图片中使用,并没有独立出来相应的网站或者软件,但是百度官方提供相应的API接口可以调用。官网
1.去百度智能云官网上开通购买对应的功能,不过百度提供1000次的免费使用机会,点击下图的“免费尝鲜”可以获取。
2.点击左侧的应用列表->创建应用->选择对应的接口功能->填写其余信息后立即创建
3.创建完成后在应用列表中你会得到对应的AppID、API Key、Secret Key,接下来需要用到
4.点击左侧的技术文档->文档中心中的API文档->图像清晰度增强。
5.如果你能够看懂官方文档就按照官方文档的步骤,如果不能则继续往下看。
6.创建spring项目,在pom.xml中导入相应的坐标
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baidu.aip</groupId>
<artifactId>java-sdk</artifactId>
<version>4.16.17</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
<!--okhttp3 依赖-->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
<dependency>
<groupId> org.apache.cassandra</groupId>
<artifactId>cassandra-all</artifactId>
<version>0.8.1</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
7.项目代码
package com.qianjin.test;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.qianjin.util.Base64Util;
import com.qianjin.util.FileUtil;
import com.qianjin.util.HttpUtil;
import okhttp3.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.util.Base64;
/**
* @Description 图片清晰度增强
* @Author qianjin
* @Date 2024/4/22 19:49
*/
public class Image_definition_enhance {
static final OkHttpClient HTTP_CLIENT = new OkHttpClient().newBuilder().build();
public static void main(String[] args) throws IOException {
/*String token = getToken2();
System.out.println(token);*/
//result为json数据{ "log_id":739539874, "image":base64str }
String result = image_definition_enhance();
JSONObject jsonObj = JSON.parseObject(result);
String image = jsonObj.getString("image");
String path = "E:\\test_file\\result2.png";
saveImage(image, path);
}
public static String image_definition_enhance() {
// 请求url
String url = "https://aip.baidubce.com/rest/2.0/image-process/v1/image_definition_enhance";
try {
// 本地文件路径
String filePath = "E:\\test_file\\1.png";
byte[] imgData = FileUtil.readFileByBytes(filePath);
String imgStr = Base64Util.encode(imgData);
String imgParam = URLEncoder.encode(imgStr, "UTF-8");
String param = "image=" + imgParam;
// 注意这里仅为了简化编码每一次请求都去获取access_token,线上环境access_token有过期时间, 客户端可自行缓存,过期后重新获取。
String accessToken = "你自己的token";
String result = HttpUtil.post(url, accessToken, param);
System.out.println(result);
return result;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String getToken2() throws IOException {
MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "");
Request request = new Request.Builder()
.url("https://aip.baidubce.com/oauth/2.0/token?client_id=&client_secret=&grant_type=client_credentials")
.method("POST", body)
.addHeader("Content-Type", "application/json")
.addHeader("Accept", "application/json")
.build();
Response response = HTTP_CLIENT.newCall(request).execute();
String token = response.body().string();
return token;
}
public static void saveImage(String base64String, String outputPath) throws IOException {
// Base64解码
byte[] decodedBytes = Base64.getDecoder().decode(base64String);
// 创建输出流
FileOutputStream fos = new FileOutputStream(outputPath);
// 将解码后的字节写入文件
fos.write(decodedBytes);
// 关闭输出流
fos.close();
System.out.println("图片已成功保存至 " + outputPath);
}
}
代码中所使用到的工具类可以从下面网址中下载
https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
https://ai.baidu.com/file/544D677F5D4E4F17B4122FBD60DB82B3
https://ai.baidu.com/file/470B3ACCA3FE43788B5A963BF0B625F3
8.功能分析
首先你在调用image_definition_enhance()进行图片处理之前需要先获取你自己的token,然后将该方法中的String accessToken = "你自己的token";这句代码替换成你所生成的token值。以下是生成token方法。
首先把main函数中的/*String token = getToken2(); System.out.println(token);*/这两行注释打开,注释下面的代码。在getToken2方法中需要改造request请求对应的url。比如说你的API Key是123,Secret Key是456,那么你对应的url应该是
url("https://aip.baidubce.com/oauth/2.0/token?client_id=123&client_secret=456&grant_type=client_credentials")
改造完之后运行程序,找到控制台输出的token,如下图“access_token”就是对应的token,因为token的过期时间是30天,所以没必要每次都获取,获取之后复制填入image_definition_enhance()方法中的String accessToken = "你自己的token";最后就可以运行main函数后面的代码进行图片处理了。
在main函数中的代码,调用image_definition_enhance()方法返回的是json格式的数据,包含“log_id”字段和“image”字段,其中经过处理的图片数据是“image”字段的内容,但是是处理后的结果是图片的Base64编码数据,需要进一步解码才能得到对应图像。这里采用的方法是,使用fastjson中的parseObject()方法将result转化为对象,然后就能获取对应“image”中的内容,再使用saveImage()方法保存解码后的图像。