Java實現利用圖片或視頻生成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動圖過大時,最好能裁剪一下尺寸或者是壓縮一下大小,這樣就能解決這個問題瞭。
以上就是Java實現利用圖片或視頻生成GIF並發送微信的詳細內容,更多關於Java生成GIF的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- JAVA實現PDF轉HTML文檔的示例代碼
- Java 讀取網絡圖片存儲到本地並生成縮略圖
- 基於Java實現二維碼的生成和解析
- Java輕松使用工具類實現獲取MP3音頻時長
- java實現圖片分割指定大小