目录
前言
别人的博客文章中有动态显示这是怎么做到的呢?别人的微信发送的表情动态为什么是自己鬼畜视频?这些都是别人做到的,本文就是让自己也可以做到以上的事情,制作鬼畜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>
代码:
publicstaticvoidmain(String[] args)throwsException{BufferedImage image1 =ImageIO.read(newFile("D:/gif/11.png"));BufferedImage image2 =ImageIO.read(newFile("D:/gif/22.jpg"));BufferedImage image3 =ImageIO.read(newFile("D:/gif/33.jpg"));BufferedImage image4 =ImageIO.read(newFile("D:/gif/44.jpg"));AnimatedGifEncoder e =newAnimatedGifEncoder();//生成的图片路径
e.start(newFileOutputStream("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图。
代码:
publicstaticvoidmain(String[] args)throwsIOException{AnimatedGifEncoder encoder =newAnimatedGifEncoder();
encoder.start("D:/gif.gif");
encoder.setTransparent(Color.WHITE);
encoder.setRepeat(0);
encoder.setDelay(50);BufferedImage img =newBufferedImage(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>
代码:
importws.schild.jave.Encoder;importws.schild.jave.EncoderException;importws.schild.jave.MultimediaObject;importws.schild.jave.encode.EncodingAttributes;importws.schild.jave.encode.VideoAttributes;importws.schild.jave.info.MultimediaInfo;importws.schild.jave.info.VideoInfo;importws.schild.jave.info.VideoSize;importjava.io.File;importjava.util.Arrays;publicclassVideoToGIf{//输出格式privatestaticfinalString outputFormat ="gif";/**
* 获得转化后的文件名
*
* @param sourceFilePath : 源视频文件路径
* @return
*/publicstaticStringgetNewFileName(String sourceFilePath){File source =newFile(sourceFilePath);String fileName = source.getName().substring(0, source.getName().lastIndexOf("."));return fileName +"."+ outputFormat;}/**
* 转化音频格式
*
* @param sourceFilePath : 源视频文件路径
* @param targetFilePath : 目标gif文件路径
* @return
*/publicstaticvoidtransform(String sourceFilePath,String targetFilePath){File source =newFile(sourceFilePath);File target =newFile(targetFilePath);try{//获得原视频的分辨率MultimediaObject mediaObject =newMultimediaObject(source);MultimediaInfo multimediaInfo = mediaObject.getInfo();VideoInfo videoInfo = multimediaInfo.getVideo();VideoSize sourceSize = videoInfo.getSize();//设置视频属性VideoAttributes video =newVideoAttributes();
video.setCodec(outputFormat);//设置视频帧率 正常为10 ,值越大越流畅
video.setFrameRate(10);//设置视频分辨率VideoSize targetSize =newVideoSize(sourceSize.getWidth()/5, sourceSize.getHeight()/5);
video.setSize(targetSize);//设置转码属性EncodingAttributes attrs =newEncodingAttributes();
attrs.setVideoAttributes(video);// 音频转换格式类Encoder encoder =newEncoder();
encoder.encode(mediaObject, target, attrs);System.out.println("转换完成...");}catch(EncoderException e){
e.printStackTrace();}}/**
* 批量转化视频格式
*
* @param sourceFolderPath : 源视频文件夹路径
* @param targetFolderPath : 目标gif文件夹路径
* @return
*/publicstaticvoidbatchTransform(String sourceFolderPath,String targetFolderPath){File sourceFolder =newFile(sourceFolderPath);if(sourceFolder.list().length !=0){Arrays.asList(sourceFolder.list()).forEach(e ->{transform(sourceFolderPath +"\\"+ e, targetFolderPath +"\\"+getNewFileName(e));});}}publicstaticvoidmain(String[] args){batchTransform("D:\\video","D:\\video");}}
效果:
发送微信
问题:
发送的gif动图变成文件形式怎么办?
解决:
文件太大和动图尺寸过大,超过了微信的尺寸范围,那么就会以文件的形式来发送你的gif动图。
所以当你的gif动图过大时,最好能裁剪一下尺寸或者是压缩一下大小,这样就能解决这个问题了。
小结
本文介绍了三种生成GIF动图的方式,自定义、图片转GIF、视频转GIF。赶快实践一下吧
点赞 收藏 关注
吾辈读书,只有两事,一者进德之事,讲求乎诚正修齐之道,以图无忝所生,一者修业之事,操习乎记诵词章之术,以图自卫其身。
版权归原作者 三省同学 所有, 如有侵权,请联系我们删除。