【邀测人像渐变】【Java】生成GIF图或视频
756665228 发布于2020-04-27 15:42 浏览:3128 回复:4
3
收藏

AI在民间的认知度最高的项目,或许就是图片特效了(表情包、娱乐短视频)

接口文档:https://ai.baidu.com/ai-doc/FACE/dk847su87

所需相关JAR

fastjson
lombok
hutool

能力介绍

业务能力 通过AI技术对多张图片进行组合处理,生成基于人脸渐变的GIF图或视频,可用于表情包生成、短视频娱乐等多种场景

GIF图生成:支持上传1-N张照片,生成基于人脸渐变过渡或非人像展示效果的GIF图(表情包)
短视频生成:支持上传1-N张照片,生成基于人脸渐变过渡或非人像的展示效果的视频,同时支持用户自定义音乐节奏,对转场速度及停留时间进行自定义调节

1-N
这里测试貌似 只能是4  大于小于4都不行

Java示例代码

import cn.hutool.http.HttpUtil;
import cn.sample.Base64Util;
import cn.sample.FileUtil;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.NoArgsConstructor;
import sun.misc.BASE64Decoder;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
/**
 * @author 小帅丶
 * @className GradientSample
 * @Description 人像渐变(邀测)
 * @Date 2020/4/27
 **/
public class GradientSample {
	/**
	 * 重要提示代码中所需工具类
	 * FileUtil,Base64Util
	 * https://ai.baidu.com/file/658A35ABAB2D404FBF903F64D47C1F72
	 * https://ai.baidu.com/file/C8D81F3301E24D2892968F09AE1AD6E2
	 * 下载
	 * lombok 需要jar和开发工具安装插件
	 * hutool 直接引入jar即可
	 * JDK    最好1.8以上
	 */
	public static void main(String[] args) throws Exception {
		String token = "【access_token】";
		String url = "https://aip.baidubce.com/rest/2.0/face/v1/gradient";
		//图片转BASE64
		String base641 = Base64Util.encode(FileUtil.readFileByBytes("【本地图片地址1】"));
		String base642 = Base64Util.encode(FileUtil.readFileByBytes("【本地图片地址2】"));
		String base643 = Base64Util.encode(FileUtil.readFileByBytes("【本地图片地址3】"));
		String base644 = Base64Util.encode(FileUtil.readFileByBytes("【本地图片地址4】"));
		GradientBean bean = new GradientBean();
		//app标识
		bean.setAppid("【appid】");
		//音乐 ID 我想输出文件类型为GIF应该是没啥用的吧
		bean.setMusic_id(1);
		//视频帧率 默认 10
		bean.setFps(10);
		//输出文件类型 可选GIF,MOV,MP4
		bean.setOutput_type("GIF");
		bean.setOutput_width(800);
		bean.setOutput_height(1280);
		//只支持4张图片 5张就报错 不知道是不是接口的限制
		List image_list = new ArrayList<>();
		GradientBean.ImageListBean imgA = new GradientBean.ImageListBean();
		imgA.setImage(base641);
		GradientBean.ImageListBean imgB = new GradientBean.ImageListBean();
		imgB.setImage(base642);
		GradientBean.ImageListBean imgC = new GradientBean.ImageListBean();
		imgC.setImage(base643);
		GradientBean.ImageListBean imgD = new GradientBean.ImageListBean();
		imgD.setImage(base644);
		image_list.add(imgA);
		image_list.add(imgB);
		image_list.add(imgC);
		image_list.add(imgD);
		bean.setImage_list(image_list);
		//每张图片的展示时长, 以空格分隔 数量要求和请求的图片张数一致 GIF默认每张图片0.7s 视频默认每张图片2s
		//这个参数必须给 且和 图片个数一致  用空格 隔开
		bean.setTempo("1 1 1 1");
		String param = JSON.toJSONString(bean);
		System.out.println(bean.getTempo());
		System.out.println(param);
		System.out.println(url + "?access_token=" + token);
		long startTime = System.currentTimeMillis();
		System.out.println("开始时间 = " + startTime);
		String result = HttpUtil.post(url + "?access_token=" + token, param);
		long endTime = System.currentTimeMillis();
		System.out.println("结束时间 = " + endTime);
		System.out.println("耗时 = " + (endTime - startTime));
		GradientResponseBean responseBean = JSON.parseObject(result, GradientResponseBean.class);
		System.out.println("结果 = " +responseBean.toString());
		//直接拿base64保存为文件
		GenerateBase64ToFile(responseBean.getResult().getOutput(),bean.getOutput_type());
		//把base64存到文本 不是必须操作
		cn.hutool.core.io.FileUtil.writeString(responseBean.getResult().getOutput(), "F://testimg//gradient.txt", "UTF-8");
	}
	@NoArgsConstructor
	@Data
	public static class GradientBean{
		private String appid;
		private int music_id;
		private int fps = 10;
		private String output_type;
		private int output_width = 800;
		private int output_height = 1280;
		private String tempo;
		private int morph_time = 1;
		private List image_list;
		@NoArgsConstructor
		@Data
		public static class ImageListBean {
			private String image;
		}
	}
	@NoArgsConstructor
	@Data
	public static class GradientResponseBean{
		private int error_code;
		private String error_msg;
		private long log_id;
		private int timestamp;
		private int cached;
		private ResultBean result;
		@Override
		public String toString() {
			return "GradientResponseBean{" +
					"error_code=" + error_code +
					", error_msg='" + error_msg + '\'' +
					", log_id=" + log_id +
					", timestamp=" + timestamp +
					", cached=" + cached +
					'}';
		}
	}
	@NoArgsConstructor
	@Data
	public static class ResultBean {
		private String output;
	}
	/**
	 * @Author 小帅丶
	 * @Description base64保存为文件
	 * @Date  2020/4/27
	 * @param imgStr 文件的base64字符串
	 * @param prefix 保存的后缀
	 * @return boolean
	 **/
	public static boolean GenerateBase64ToFile(String imgStr,String prefix) {   //对字节数组字符串进行Base64解码并生成图片
		BASE64Decoder decoder = new BASE64Decoder();
		try {
			if(imgStr == null) {
				//图像数据为空
				return false;
			}else{
				//Base64解码
				byte[] b = decoder.decodeBuffer(imgStr);
				for (int i = 0; i < b.length; ++i) {
					////调整异常数据
					if (b[i] < 0) {
						b[i] += 256;
					}
				}
				//生成jpeg图片 新生成的图片
				String imgFilePath = "F://testimg//"+System.currentTimeMillis()+"."+prefix.toLowerCase();
				OutputStream out = new FileOutputStream(imgFilePath);
				out.write(b);
				out.flush();
				out.close();
				return true;
			}
		} catch (Exception e) {
			return false;
		}
	}
}

生成后保存成GIF闪图

收藏
点赞
3
个赞
共4条回复 最后由椅蹿壁竟回复于2020-10-14 18:04
#2756665228回复于2020-04-27 15:49:20

生成的原始GIT-MP4文件请移步百度云

链接: https://pan.baidu.com/s/1Lz6zICWH4grEC-II-ML7iw 提取码: qqhv
2
#4羊驼001回复于2020-05-06 11:57:31

up

0
#3羊驼001回复于2020-04-27 16:24:40

wow

0
TOP
切换版块