目录

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

前言

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

GIF简介

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

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

代码生成

以下介绍几种生成方式。

图片合成GIF

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

<!--  任选其一 -->
<dependency><groupId>com.madgag</groupId><artifactId>animated-gif-lib</artifactId><version>1.4</version>
</dependency><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.0.6</version>
</dependency>

代码:

  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工具包。

依赖:

<dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>3.1.1</version></dependency><!-- 根据系统二选一 --><!-- win系统 --><dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-win64</artifactId><version>3.1.1</version></dependency><!-- linux系统 --><dependency><groupId>ws.schild</groupId><artifactId>jave-nativebin-linux64</artifactId><version>3.1.1</version></dependency>

<dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>3.0.1</version></dependency>

代码:

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。赶快实践一下吧


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

Java图片或视频生成GIF动图,发送微信相关推荐

  1. Java截取视频生成Gif动图

    添加jar包依赖 <!-- 视频截图 --> <dependency><groupId>org.bytedeco</groupId><artifa ...

  2. FFmpeg进阶: 截取视频生成gif动图

    文章目录 1.封装视频滤镜 2.截取视频生成gif 3.gif优化 4.示例效果 现在互联网上很多人都通过表情包来表达自己的情绪,常用的表情包很多都是视频文件的一部分.这里就介绍一下如何通过ffmpe ...

  3. (无报错)Java截取视频生成Gif动图 视频转gif动态图 视频截帧取图 java实现方式

    不废话直接上代码 1.maven坐标 <!-- 视频截图 --><dependency><groupId>org.bytedeco</groupId>& ...

  4. java根据jpg格式图片或视频文件生成gif动图

    1. 多张jpg图片制作GIF <dependency>   <groupId>com.madgag</groupId>   <artifactId>a ...

  5. 视频怎么做GIF表情包?教你一键生成gif动图

    随着网络的普及,大家在网上聊天的时候都经常会使用表情包,其中很多表情包都是动态的,而且也都是我们熟悉的一些视频片段制作而成的,那么视频怎么做gif表情包呢?一般来说,制作gif动图都比较麻烦,需要使用 ...

  6. 如何快速生成gif动图表情包?教你制作gif表情包图片

    Gif动图作为当代网络较为流行的一种图片格式,经常会在公众号推文中.聊天软件聊天中见到其身影.那么,gif动图表情包是如何制作的呢?通常情况下,制作gif动画图片需要专业的工具,而大家可以使用[GIF ...

  7. linux将gif合并成视频,如何将动图转化为视频?多张GIF图片合并成视频的方法

    我们都知道GIF动态图片是不能狗发送到朋友圈的,因为发送到朋友圈之后就变成静图了,静态图片并不能把GIF动图的精髓表现出来,那么有喜欢的动图,想要发送到朋友圈的时候该怎么办?怎么样才能将GIF图片发到 ...

  8. 怎么把视频压缩成表情包?如何把视频做成GIF动图

    平时我们看到的电影.电视剧.综艺.动漫等等的视频其实都可以作为制作gif动图的素材来使用,我们可以截取视频中的一小部分来转换成gif,这样无论是在聊天时或者是新媒体工作者在写文章时都可以方便使用,那么 ...

  9. Python实现视频转 gif 动图

    Python实现视频转 gif 动图 1. 准备工作 需要准备用于生成 gif的 视频文件 ,另外,就是需要用到 moviepy库,关于这个库更详细的介绍可以查看它的官方文档. https://zul ...

最新文章

  1. linux内核崩溃无日志,教你如何捕捉内核崩溃信息
  2. 远程挂载 NFS 共享目录引发死机问题
  3. 最小二乘法的本质原理
  4. 嵌入式学习路线怎么学,如何学习嵌入式系统
  5. 机器学习第九篇:详解Adaboost算法
  6. Android开发之线程池管理ThreadPoolExecutor和Executors.newSingleThreadExecutor()
  7. uniny 物体运动到一个点停止_人教版高中英语必修五Unit 5 单词详解
  8. ASML 发布2021年第三季度财报
  9. git tag 的基本用法
  10. java多线程按行读取文件_“java”中多线程按行读取txt且每个线程读的内容不能重复,这么求“demo”?...
  11. ./configure: line 4850: ` XIPH_PATH_OGG(, as_fn_error $? '
  12. 百度亮相NeurIPS 首届Expo:向世界科普了中国自动机器学习框架
  13. 基于Java+MyEclipse+Socket+GUI的网络通讯录(C#可以参考为WinForm通讯录结构大体类似)
  14. 怎样在计算机硬盘里新建文件,高手教你轻松新建文件夹
  15. 教你30分钟快速搭建直播间
  16. win7系统dhcp服务器设置方法,win7设定固定ip和同时支持dhcp的方法
  17. CAD命令行不见了怎么重新恢复?
  18. 表单提交 onsubmit=return false
  19. 有消息称富士康已减少iPhone4出货量
  20. android 版本分布 最新,安卓手机系统版本分布:Android 9.0占比达34%!

热门文章

  1. 程序员电脑上装360安全卫士吗?
  2. c++ 无穷大0x7FFFFFFF+0x7FFFFFFF 是多少
  3. 小迪渗透JAVA安全(肆)
  4. Struts2 基于XML校验(易百教程)
  5. 标梵讲怎样设计让自己的APP更精致有型?
  6. Word2013默认情况下按Ctrl+F到导航框问题处理
  7. 西门子服务器模块作用是什么,S7-1200为什么要加通信模块,其作用是什么-工业支持中心-西门子中国...
  8. 供应链管理:如何有效进行供应商管理?
  9. 百度开发者中心 研究
  10. angular n'g-zorro走马灯划过时如何停止切换