Java實現(xiàn)動態(tài)生成GIF圖像詳解
背景
在互聯(lián)網(wǎng)上有許多有趣的場景,其中的一種就是動圖。這不是視頻,而是一種GIF圖像信息。雖然沒有聲音,卻給我們帶來了無窮的樂趣。如果說斗圖是曾經(jīng)聊天或者網(wǎng)聊的樂趣,那動圖一定是承包了這種歡樂的技術原理。
GIF的全稱是Graphics Interchange Format,可譯為圖形交換格式,用于以超文本標志語言(Hypertext Markup Language)方式顯示索引彩色圖像,在因特網(wǎng)和其他在線服務系統(tǒng)上得到廣泛應用。GIF是一種公用的圖像文件格式標準,版權歸Compu Serve公司所有。
那么這些GIF圖片可以使用什么技術來生成呢?今天分享一種JAVA的實現(xiàn),基于開源庫AnimatedGifEncoder,動態(tài)構建GIF圖庫。掌握了這個技術,加上你天才的頭腦,一定可以發(fā)揮出獨特的創(chuàng)意,創(chuàng)作出充滿智慧或者可以令人腦洞大開的內(nèi)容。不多說,正式開始吧。
特點
GIF格式的圖像文件具有如下特點:
(1)GIF格式圖像文件的擴展名是“.gif”;
(2)對于灰度圖像表現(xiàn)最佳;
(3)具有GIF87a和GIF89a兩個版本;
(4)采用改進的LZW壓縮算法處理圖像數(shù)據(jù);
(5)調色板數(shù)據(jù)有通用調色板和局部調色板之分,有不同的顏色取值;
(6)不支持24bit彩色模式,最多存儲256色。
用途
①GIF是壓縮格式的文件,用于減少文件在網(wǎng)絡上傳遞的時間;
②GIF的位深為1-8bit,單色透明,由一個最多256種顏色的調色板實現(xiàn),圖像大小最多為64K×64K像素。GIF主要是為一個數(shù)據(jù)流而設計的一種傳輸格式,而不是作為文件的存當格式,因此它是最復雜的一種圖像文件格式;
③支持Bitmap、Grayscale和索引彩色模式。
AnimatedGifEncoder簡介
AnimatedGifEncoder是Kevin Weiner編寫的,其作者授權所有人可以以任何方式使用這份代碼,但是需要注意代碼中所使用的LZW算法由Unisys掌握專利權。不過鑒于此專利在2006年就已經(jīng)在大部分國家及地區(qū)過期了,所以現(xiàn)在應該可以放心地使用了。
GIF創(chuàng)作生成
一、創(chuàng)建maven項目
新建一個maven項目,引入相關資源包。關鍵代碼如下所示:
<!-- https://mvnrepository.com/artifact/com.madgag/animated-gif-lib --> <dependency> <groupId>com.madgag</groupId> <artifactId>animated-gif-lib</artifactId> <version>1.4</version> </dependency>
二、自定義生成
自定義生成之指,直接使用系統(tǒng)創(chuàng)建的方式來生成gif,不使用外部的圖片、視頻等資源,直接在界面上繪制一個GIF圖。下面給出關鍵代碼:
package com.yelang.mp42gif; import java.awt.Color; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import com.madgag.gif.fmsware.AnimatedGifEncoder; public class PageTest { public static final int SIZE = 200; public static void main(String[] args) throws IOException { AnimatedGifEncoder encoder = new AnimatedGifEncoder(); encoder.start("D:/giftest/out.gif"); encoder.setTransparent(Color.WHITE); encoder.setRepeat(0); encoder.setDelay(50); BufferedImage img = new BufferedImage(SIZE, SIZE, BufferedImage.TYPE_3BYTE_BGR); Graphics2D g2d = img.createGraphics(); for (int i=0; i<100; i++) { g2d.setColor(Color.WHITE); g2d.fillRect(0, 0, SIZE, SIZE); g2d.setColor(Color.BLACK); g2d.drawOval(0, i, 120, 120); encoder.addFrame(img); } g2d.dispose(); encoder.finish(); System.out.println("完成"); } }
執(zhí)行完成后,在目標文件夾下,可以看到輸出了gif圖片,
將out.gif文件拖拽到瀏覽器中,可以看到動態(tài)的效果,如下圖:
三、自定義將多張圖片合成
在一些需求里,比如根據(jù)給定的多張圖片(比如下面1-4.jpg四張)來合成一張gif圖片。這種需求又如何來實現(xiàn)呢?這里重點介紹這種需求的解決方案。
1、定義原始的數(shù)據(jù)源
BufferedImage image1 = ImageIO.read(new File("D:/giftest/dir2/1.jpg")); BufferedImage image2 = ImageIO.read(new File("D:/giftest/dir2/2.jpg")); BufferedImage image3 = ImageIO.read(new File("D:/giftest/dir2/3.jpg")); BufferedImage image4 = ImageIO.read(new File("D:/giftest/dir2/4.jpg"));
上述代碼將原始的圖片轉換成輸入流備用
2、gif對象設置
AnimatedGifEncoder e = new AnimatedGifEncoder(); // 設置生成圖片大小 e.setSize(4000, 3000); //生成的圖片路徑 e.start("D:/giftest/dir2/demo1.gif"); //圖片之間間隔時間 e.setDelay(500); //重復次數(shù) 0表示無限重復 默認不重復 e.setRepeat(0); e.setQuality(5);
3、圖片填充
//添加圖片 e.addFrame(image1); e.addFrame(image2); e.addFrame(image3); e.addFrame(image4); e.finish();
完成的代碼如下:
public static void test3() throws IOException { BufferedImage image1 = ImageIO.read(new File("D:/giftest/dir2/1.jpg")); BufferedImage image2 = ImageIO.read(new File("D:/giftest/dir2/2.jpg")); BufferedImage image3 = ImageIO.read(new File("D:/giftest/dir2/3.jpg")); BufferedImage image4 = ImageIO.read(new File("D:/giftest/dir2/4.jpg")); AnimatedGifEncoder e = new AnimatedGifEncoder(); // 設置生成圖片大小 e.setSize(4000, 3000); //生成的圖片路徑 e.start("D:/giftest/dir2/demo1.gif"); //圖片之間間隔時間 e.setDelay(500); //重復次數(shù) 0表示無限重復 默認不重復 e.setRepeat(0); e.setQuality(5); //添加圖片 e.addFrame(image1); e.addFrame(image2); e.addFrame(image3); e.addFrame(image4); e.finish(); System.out.println("finish"); }
執(zhí)行完成后,可以看到生成GIF圖如下:
話外題-懷念巨人
GIF的發(fā)明者是美國計算機科學家、GIF圖像格式發(fā)明人斯蒂芬•威爾海特(Stephen Wilhite)。據(jù)美國媒體報道,當?shù)貢r間3月14日,gif的發(fā)明者斯蒂芬·威爾海特因疫情去世,享年74歲。他的妻子凱瑟琳在接受采訪時提到,威爾海特去世前他的家人都陪伴在他的身邊,而在訃告中也提到“盡管取得了諸多成就,但他仍然是一個非常謙遜、善良的好人。”
總結
本文簡要講述了GIF圖像知識,并且以JAVA技術為例,介紹了后臺生成GIF的技術,并提供較詳細的代碼示例,希望對您有幫助。最后懷念因新冠感染去世的GIF的發(fā)明者,斯蒂芬•威爾海特。感恩這個時代,我們站在無數(shù)巨人的肩膀上,以至于可以專心去享受這些技術帶來的快感。
以上就是Java實現(xiàn)動態(tài)生成GIF圖像詳解的詳細內(nèi)容,更多關于Java生成GIF的資料請關注腳本之家其它相關文章!
相關文章
深入學習java并發(fā)包ConcurrentHashMap源碼
這篇文章主要介紹了深入學習java并發(fā)包ConcurrentHashMap源碼,整個 ConcurrentHashMap 由一個個 Segment 組成,Segment 代表”部分“或”一段“的意思,所以很多地方都會將其描述為分段鎖。,需要的朋友可以參考下2019-06-06spring?boot?executable?jar/war?原理解析
spring boot里其實不僅可以直接以 java -jar demo.jar的方式啟動,還可以把jar/war變?yōu)橐粋€可以執(zhí)行的腳本來啟動,比如./demo.jar,這篇文章主要介紹了spring?boot?executable?jar/war?原理,需要的朋友可以參考下2023-02-02Java使用@Validated注解進行參數(shù)驗證的方法
這篇文章主要介紹了Java使用@Validated注解進行參數(shù)驗證的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-08-08