最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java實(shí)現(xiàn)利用圖片或視頻生成GIF并發(fā)送微信

 更新時(shí)間:2022年11月21日 15:28:13   作者:三省同學(xué)  
這篇文章主要為大家詳細(xì)介紹了Java語(yǔ)言如何利用圖片或視頻實(shí)現(xiàn)生成GIF并發(fā)送微信的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以嘗試一下

前言

別人的博客文章中有動(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)文章

  • 如何使用Comparator比較接口實(shí)現(xiàn)ArrayList集合排序

    如何使用Comparator比較接口實(shí)現(xiàn)ArrayList集合排序

    這篇文章主要介紹了如何使用Comparator比較接口實(shí)現(xiàn)ArrayList集合排序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Java修改Integer變量值遇到的問(wèn)題及解決

    Java修改Integer變量值遇到的問(wèn)題及解決

    這篇文章主要介紹了Java修改Integer變量值遇到的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java控制臺(tái)實(shí)現(xiàn)猜拳游戲小游戲

    Java控制臺(tái)實(shí)現(xiàn)猜拳游戲小游戲

    這篇文章主要為大家詳細(xì)介紹了Java控制臺(tái)實(shí)現(xiàn)猜拳游戲小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Spring AOP源碼深入分析

    Spring AOP源碼深入分析

    這篇文章主要介紹了Spring AOP源碼,AOP(Aspect Orient Programming),直譯過(guò)來(lái)就是 面向切面編程,AOP 是一種編程思想,是面向?qū)ο缶幊蹋∣OP)的一種補(bǔ)充
    2023-01-01
  • Java類(lèi)變量和成員變量初始化過(guò)程的應(yīng)用介紹

    Java類(lèi)變量和成員變量初始化過(guò)程的應(yīng)用介紹

    昨天看了一本叫做《突破程序員基本功的16課》的書(shū),個(gè)人感覺(jué)還可以,主要對(duì)Java的技巧進(jìn)行了一些深入的講解,讓我對(duì)類(lèi)的初始化和對(duì)象的創(chuàng)建有了新的認(rèn)識(shí)
    2013-04-04
  • Springboot項(xiàng)目啟動(dòng)不加載resources目錄下的文件問(wèn)題

    Springboot項(xiàng)目啟動(dòng)不加載resources目錄下的文件問(wèn)題

    這篇文章主要介紹了Springboot項(xiàng)目啟動(dòng)不加載resources目錄下的文件問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • 關(guān)于Spring的AnnotationAwareAspectJAutoProxyCreator類(lèi)解析

    關(guān)于Spring的AnnotationAwareAspectJAutoProxyCreator類(lèi)解析

    這篇文章主要介紹了關(guān)于Spring的AnnotationAwareAspectJAutoProxyCreator類(lèi)解析,Spring是一個(gè)開(kāi)源免費(fèi)的框架 , 容器,是一個(gè)輕量級(jí)的框架 ,需要的朋友可以參考下
    2023-05-05
  • IntelliJ?IDEA?2023.2最新版激活方法及驗(yàn)證ja-netfilter配置是否成功

    IntelliJ?IDEA?2023.2最新版激活方法及驗(yàn)證ja-netfilter配置是否成功

    隨著2023.2版本的發(fā)布,用戶(hù)們渴望了解如何激活這個(gè)最新版的IDE,本文將介紹三種可行的激活方案,包括許可證服務(wù)器、許可證代碼和idea?vmoptions配置,幫助讀者成功激活并充分利用IDEA的功能,感興趣的朋友參考下吧
    2023-08-08
  • Java 線程池核心參數(shù)、執(zhí)行流程與實(shí)戰(zhàn)建議全解析

    Java 線程池核心參數(shù)、執(zhí)行流程與實(shí)戰(zhàn)建議全解析

    主要介紹了 Java 線程池:核心參數(shù)、執(zhí)行流程與實(shí)戰(zhàn)建議,我將用最通俗的方式帶你搞懂 Java 線程池,從構(gòu)造函數(shù)開(kāi)始,講透執(zhí)行機(jī)制、參數(shù)配置,再結(jié)合我在真實(shí)項(xiàng)目中的使用經(jīng)驗(yàn),總結(jié)出一套實(shí)戰(zhàn)建議,需要的朋友可以參考下
    2025-04-04
  • Spring?Security中的CORS詳解

    Spring?Security中的CORS詳解

    CORS(Cross-Origin?Resource?Sharing)是一種允許不同源之間進(jìn)行資源共享的W3C標(biāo)準(zhǔn),它通過(guò)在服務(wù)器端設(shè)置特定的HTTP響應(yīng)頭,實(shí)現(xiàn)了跨域請(qǐng)求的功能,這種機(jī)制要求瀏覽器和服務(wù)器的支持,本文給大家介紹Spring?Security中的CORS,感興趣的朋友一起看看吧
    2024-10-10

最新評(píng)論

偏关县| 横山县| 平武县| 张家界市| 磐安县| 嘉定区| 德钦县| 靖江市| 同仁县| 元朗区| 南康市| 小金县| 外汇| 武强县| 大余县| 德惠市| 海盐县| 定南县| 交城县| 乌拉特中旗| 白朗县| 平利县| 沅陵县| 吴桥县| 黄大仙区| 林口县| 香港 | 登封市| 疏勒县| 马尔康县| 东明县| 手游| 河津市| 漠河县| 拉萨市| 神农架林区| 扶沟县| 康保县| 龙州县| 乌兰县| 呼图壁县|