
在互联网上有许多有趣的场景,其中的一种就是动图。这不是视频,而是一种GIF图像信息。虽然没有声音,却给我们带来了无穷的乐趣。如果说斗图是曾经聊天或者网聊的乐趣,那动图一定是承包了这种欢乐的技术原理。
GIF的全称是Graphics Interchange Format,可译为图形交换格式,用于以超文本标志语言(Hypertext Markup Language)方式显示索引彩色图像,在因特网和其他在线服务系统上得到广泛应用。GIF是一种公用的图像文件格式标准,版权归Compu Serve公司所有。
那么这些GIF图片可以使用什么技术来生成呢?今天分享一种JAVA的实现,基于开源库AnimatedGifEncoder,动态构建GIF图库。掌握了这个技术,加上你天才的头脑,一定可以发挥出独特的创意,创作出充满智慧或者可以令人脑洞大开的内容。不多说,正式开始吧。
GIF格式的图像文件具有如下特点:
(1)GIF格式图像文件的扩展名是“.gif”;
(2)对于灰度图像表现最佳;
(3)具有GIF87a和GIF89a两个版本;
(4)采用改进的LZW压缩算法处理图像数据;
(5)调色板数据有通用调色板和局部调色板之分,有不同的颜色取值;
(6)不支持24bit彩色模式,最多存储256色。
①GIF是压缩格式的文件,用于减少文件在网络上传递的时间;
②GIF的位深为1-8bit,单色透明,由一个最多256种颜色的调色板实现,图像大小最多为64K×64K像素。GIF主要是为一个数据流而设计的一种传输格式,而不是作为文件的存当格式,因此它是最复杂的一种图像文件格式;
③支持Bitmap、Grayscale和索引彩色模式。
AnimatedGifEncoder是Kevin Weiner编写的,其作者授权所有人可以以任何方式使用这份代码,但是需要注意代码中所使用的LZW算法由Unisys掌握专利权。不过鉴于此专利在2006年就已经在大部分国家及地区过期了,所以现在应该可以放心地使用了。
新建一个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>自定义生成之指,直接使用系统创建的方式来生成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("完成");
}
}执行完成后,在目标文件夹下,可以看到输出了gif图片,

在一些需求里,比如根据给定的多张图片(比如下面1-4.jpg四张)来合成一张gif图片。这种需求又如何来实现呢?这里重点介绍这种需求的解决方案。

1、定义原始的数据源
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);
//重复次数 0表示无限重复 默认不重复
e.setRepeat(0);
e.setQuality(5);3、图片填充
//添加图片
e.addFrame(image1);
e.addFrame(image2);
e.addFrame(image3);
e.addFrame(image4);
e.finish();执行完成后,可以看到生成GIF图如下:

本文简要讲述了GIF图像知识,并且以JAVA技术为例,介绍了后台生成GIF的技术,并提供较详细的代码示例,希望对您有帮助。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。