Java實(shí)現(xiàn)利用圖片或視頻生成GIF并發(fā)送微信
前言
別人的博客文章中有動(dòng)態(tài)顯示這是怎么做到的呢?別人的微信發(fā)送的表情動(dòng)態(tài)為什么是自己鬼畜視頻?這些都是別人做到的,本文就是讓自己也可以做到以上的事情,制作鬼畜GIF動(dòng)態(tài),辣就學(xué)起來(lái)吧!

GIF簡(jiǎn)介
GIF的發(fā)明者是美國(guó)計(jì)算機(jī)科學(xué)家、GIF圖像格式發(fā)明人斯蒂芬•威爾海特(Stephen Wilhite)。
GIF圖形交換格式是一種位圖圖形文件格式,以8位色(即256種顏色)重現(xiàn)真彩色的圖像。它實(shí)際上是一種壓縮文檔,采用LZW壓縮算法進(jìn)行編碼,有效地減少了圖像文件在網(wǎng)絡(luò)上傳輸?shù)臅r(shí)間。它是目前廣泛應(yīng)用于網(wǎng)絡(luò)傳輸?shù)膱D像格式之一。
代碼生成
以下介紹幾種生成方式。
圖片合成GIF
如何根據(jù)給定的多張圖片來(lái)合成一張gif圖片。這種需求又如何來(lái)實(shí)現(xiàn)呢?
<!-- 任選其一 -->
<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);
//圖片之間間隔時(shí)間
e.setDelay(400);
//重復(fù)次數(shù) 0表示無(wú)限重復(fù) 默認(rèn)不重復(fù)
e.setRepeat(0);
//添加圖片
e.addFrame(image1);
e.addFrame(image2);
e.addFrame(image3);
e.addFrame(image4);
e.finish();
}效果如下:

自定義GIF動(dòng)圖
自定義生成,直接使用系統(tǒng)創(chuàng)建的方式來(lái)生成gif,不使用外部的圖片、視頻等資源,直接在界面上繪制一個(gè)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工具包,是目前主流的對(duì)視頻和音頻進(jìn)行轉(zhuǎn)碼、裁剪以及提取操作的java工具包。
依賴(lài):
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-core</artifactId>
<version>3.1.1</version>
</dependency>
<!-- 根據(jù)系統(tǒng)二選一 -->
<!-- win系統(tǒng) -->
<dependency>
<groupId>ws.schild</groupId>
<artifactId>jave-nativebin-win64</artifactId>
<version>3.1.1</version>
</dependency>
<!-- linux系統(tǒng) -->
<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";
/**
* 獲得轉(zhuǎn)化后的文件名
*
* @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;
}
/**
* 轉(zhuǎn)化音頻格式
*
* @param sourceFilePath : 源視頻文件路徑
* @param targetFilePath : 目標(biāo)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();
//設(shè)置視頻屬性
VideoAttributes video = new VideoAttributes();
video.setCodec(outputFormat);
//設(shè)置視頻幀率 正常為10 ,值越大越流暢
video.setFrameRate(10);
//設(shè)置視頻分辨率
VideoSize targetSize = new VideoSize(sourceSize.getWidth() / 5, sourceSize.getHeight() / 5);
video.setSize(targetSize);
//設(shè)置轉(zhuǎn)碼屬性
EncodingAttributes attrs = new EncodingAttributes();
attrs.setVideoAttributes(video);
// 音頻轉(zhuǎn)換格式類(lèi)
Encoder encoder = new Encoder();
encoder.encode(mediaObject, target, attrs);
System.out.println("轉(zhuǎn)換完成...");
} catch (EncoderException e) {
e.printStackTrace();
}
}
/**
* 批量轉(zhuǎn)化視頻格式
*
* @param sourceFolderPath : 源視頻文件夾路徑
* @param targetFolderPath : 目標(biāo)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");
}
}
效果:

發(fā)送微信

問(wèn)題:
發(fā)送的gif動(dòng)圖變成文件形式怎么辦?
解決:
文件太大和動(dòng)圖尺寸過(guò)大,超過(guò)了微信的尺寸范圍,那么就會(huì)以文件的形式來(lái)發(fā)送你的gif動(dòng)圖。
所以當(dāng)你的gif動(dòng)圖過(guò)大時(shí),最好能裁剪一下尺寸或者是壓縮一下大小,這樣就能解決這個(gè)問(wèn)題了。
以上就是Java實(shí)現(xiàn)利用圖片或視頻生成GIF并發(fā)送微信的詳細(xì)內(nèi)容,更多關(guān)于Java生成GIF的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SpringBoot之logback-spring.xml不生效的解決方法
這篇文章主要介紹了SpringBoot之logback-spring.xml不生效的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
SpringBoot項(xiàng)目運(yùn)行jar包啟動(dòng)的步驟流程解析
這篇文章主要介紹了SpringBoot項(xiàng)目運(yùn)行jar包啟動(dòng)的步驟流程,本文分步驟通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-07-07
JAXB命名空間及前綴_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要給大家介紹了關(guān)于JAXB命名空間及前綴的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
Java內(nèi)部類(lèi)及其特點(diǎn)的講解
今天小編就為大家分享一篇關(guān)于Java內(nèi)部類(lèi)及其特點(diǎn)的講解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01
Spring Cloud 中@FeignClient注解中的contextId屬性詳解
這篇文章主要介紹了Spring Cloud 中@FeignClient注解中的contextId屬性詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09

