Java图片或视频生成GIF动图,发送微信
创始人
2024-04-01 07:12:06
0

目录

  • 前言
  • GIF简介
  • 代码生成
    • 图片合成GIF
    • 自定义GIF动图
    • 视频生成GIF
  • 发送微信
  • 小结

前言

别人的博客文章中有动态显示这是怎么做到的呢?别人的微信发送的表情动态为什么是自己鬼畜视频?这些都是别人做到的,本文就是让自己也可以做到以上的事情,制作鬼畜GIF动态,辣就学起来吧!

请添加图片描述

GIF简介

GIF的发明者是美国计算机科学家、GIF图像格式发明人斯蒂芬•威尔海特(Stephen Wilhite)。

GIF图形交换格式是一种位图图形文件格式,以8位色(即256种颜色)重现真彩色的图像。它实际上是一种压缩文档,采用LZW压缩算法进行编码,有效地减少了图像文件在网络上传输的时间。它是目前广泛应用于网络传输的图像格式之一。

代码生成

以下介绍几种生成方式。

图片合成GIF

如何根据给定的多张图片来合成一张gif图片。这种需求又如何来实现呢?


com.madgaganimated-gif-lib1.4
cn.hutoolhutool-all5.0.6

代码:

  public static void main(String[] args) throws Exception {BufferedImage image1 = ImageIO.read(new File("D:/gif/11.png"));BufferedImage image2 = ImageIO.read(new File("D:/gif/22.jpg"));BufferedImage image3 = ImageIO.read(new File("D:/gif/33.jpg"));BufferedImage image4 = ImageIO.read(new File("D:/gif/44.jpg"));AnimatedGifEncoder e = new AnimatedGifEncoder();//生成的图片路径e.start(new FileOutputStream("D:/gif.gif"));//图片宽高e.setSize(300, 190);//图片之间间隔时间e.setDelay(400);//重复次数 0表示无限重复 默认不重复e.setRepeat(0);//添加图片e.addFrame(image1);e.addFrame(image2);e.addFrame(image3);e.addFrame(image4);e.finish();}

效果如下:
请添加图片描述

自定义GIF动图

自定义生成,直接使用系统创建的方式来生成gif,不使用外部的图片、视频等资源,直接在界面上绘制一个GIF图。
代码:

 public static void main(String[] args) throws IOException {AnimatedGifEncoder encoder = new AnimatedGifEncoder();encoder.start("D:/gif.gif");encoder.setTransparent(Color.WHITE);encoder.setRepeat(0);encoder.setDelay(50);BufferedImage img = new BufferedImage(200, 180, BufferedImage.TYPE_3BYTE_BGR);Graphics2D g2d = img.createGraphics();for (int i = 0; i < 100; i++) {g2d.setColor(Color.WHITE);g2d.fillRect(0, 0, 200, 180);g2d.setColor(Color.BLUE);g2d.drawOval(0, i, 120, 120);encoder.addFrame(img);}g2d.dispose();encoder.finish();}

效果:
请添加图片描述

请添加图片描述

视频生成GIF

ws.schild是基于ffmpeg的java工具包,是目前主流的对视频和音频进行转码、裁剪以及提取操作的java工具包。

依赖:

ws.schildjave-core3.1.1ws.schildjave-nativebin-win643.1.1ws.schildjave-nativebin-linux643.1.1

ws.schildjave-all-deps3.0.1

代码:

import ws.schild.jave.Encoder;
import ws.schild.jave.EncoderException;
import ws.schild.jave.MultimediaObject;
import ws.schild.jave.encode.EncodingAttributes;
import ws.schild.jave.encode.VideoAttributes;
import ws.schild.jave.info.MultimediaInfo;
import ws.schild.jave.info.VideoInfo;
import ws.schild.jave.info.VideoSize;import java.io.File;
import java.util.Arrays;public class VideoToGIf {//输出格式private static final String outputFormat = "gif";/*** 获得转化后的文件名** @param sourceFilePath : 源视频文件路径* @return*/public static String getNewFileName(String sourceFilePath) {File source = new File(sourceFilePath);String fileName = source.getName().substring(0, source.getName().lastIndexOf("."));return fileName + "." + outputFormat;}/*** 转化音频格式** @param sourceFilePath : 源视频文件路径* @param targetFilePath : 目标gif文件路径* @return*/public static void transform(String sourceFilePath, String targetFilePath) {File source = new File(sourceFilePath);File target = new File(targetFilePath);try {//获得原视频的分辨率MultimediaObject mediaObject = new MultimediaObject(source);MultimediaInfo multimediaInfo = mediaObject.getInfo();VideoInfo videoInfo = multimediaInfo.getVideo();VideoSize sourceSize = videoInfo.getSize();//设置视频属性VideoAttributes video = new VideoAttributes();video.setCodec(outputFormat);//设置视频帧率 正常为10 ,值越大越流畅video.setFrameRate(10);//设置视频分辨率VideoSize targetSize = new VideoSize(sourceSize.getWidth() / 5, sourceSize.getHeight() / 5);video.setSize(targetSize);//设置转码属性EncodingAttributes attrs = new EncodingAttributes();attrs.setVideoAttributes(video);// 音频转换格式类Encoder encoder = new Encoder();encoder.encode(mediaObject, target, attrs);System.out.println("转换完成...");} catch (EncoderException e) {e.printStackTrace();}}/*** 批量转化视频格式** @param sourceFolderPath : 源视频文件夹路径* @param targetFolderPath : 目标gif文件夹路径* @return*/public static void batchTransform(String sourceFolderPath, String targetFolderPath) {File sourceFolder = new File(sourceFolderPath);if (sourceFolder.list().length != 0) {Arrays.asList(sourceFolder.list()).forEach(e -> {transform(sourceFolderPath + "\\" + e, targetFolderPath + "\\" + getNewFileName(e));});}}public static void main(String[] args) {batchTransform("D:\\video", "D:\\video");}
}

效果:
请添加图片描述

发送微信

在这里插入图片描述
问题:

发送的gif动图变成文件形式怎么办?

解决:
文件太大和动图尺寸过大,超过了微信的尺寸范围,那么就会以文件的形式来发送你的gif动图。
所以当你的gif动图过大时,最好能裁剪一下尺寸或者是压缩一下大小,这样就能解决这个问题了。

小结

本文介绍了三种生成GIF动图的方式,自定义、图片转GIF、视频转GIF。赶快实践一下吧

在这里插入图片描述
点赞 收藏 关注
吾辈读书,只有两事,一者进德之事,讲求乎诚正修齐之道,以图无忝所生,一者修业之事,操习乎记诵词章之术,以图自卫其身。

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...