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其它相關文章!

推薦閱讀: