Java实现动态生成GIF图像详解

 更新时间:2022年09月13日 11:17:20   作者:yelangking1  
在互联网上有许多有趣的场景,其中的一种就是动图。这不是视频,而是一种GIF图像信息。本文将利用Java实现动态生成GIF图像功能,需要的可以参考一下

背景

在互联网上有许多有趣的场景,其中的一种就是动图。这不是视频,而是一种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简介

AnimatedGifEncoder是Kevin Weiner编写的,其作者授权所有人可以以任何方式使用这份代码,但是需要注意代码中所使用的LZW算法由Unisys掌握专利权。不过鉴于此专利在2006年就已经在大部分国家及地区过期了,所以现在应该可以放心地使用了。

GIF创作生成

一、创建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>

二、自定义生成

自定义生成之指,直接使用系统创建的方式来生成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图片,

将out.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"));

上述代码将原始的图片转换成输入流备用

2、gif对象设置

 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();

完成的代码如下:

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); 
	    //重复次数 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");
	}

执行完成后,可以看到生成GIF图如下:

话外题-怀念巨人

GIF的发明者是美国计算机科学家、GIF图像格式发明人斯蒂芬•威尔海特(Stephen Wilhite)。据美国媒体报道,当地时间3月14日,gif的发明者斯蒂芬·威尔海特因疫情去世,享年74岁。他的妻子凯瑟琳在接受采访时提到,威尔海特去世前他的家人都陪伴在他的身边,而在讣告中也提到“尽管取得了诸多成就,但他仍然是一个非常谦逊、善良的好人。”

总结

本文简要讲述了GIF图像知识,并且以JAVA技术为例,介绍了后台生成GIF的技术,并提供较详细的代码示例,希望对您有帮助。最后怀念因新冠感染去世的GIF的发明者,斯蒂芬•威尔海特。感恩这个时代,我们站在无数巨人的肩膀上,以至于可以专心去享受这些技术带来的快感。

以上就是Java实现动态生成GIF图像详解的详细内容,更多关于Java生成GIF的资料请关注脚本之家其它相关文章!

相关文章

  • 举例讲解Java的Spring框架中AOP程序设计方式的使用

    举例讲解Java的Spring框架中AOP程序设计方式的使用

    这篇文章主要介绍了Java的Spring框架中AOP程序设计方式的使用讲解,文中举的AOP下抛出异常的例子非常实用,需要的朋友可以参考下
    2016-04-04
  • Java中各种集合判空方法总结

    Java中各种集合判空方法总结

    最近接触集合比较多,经常对于集合是否为空做判断,下面这篇文章主要给大家介绍了关于Java中各种集合判空方法总结的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 带你快速搞定java IO

    带你快速搞定java IO

    这篇文章主要介绍了Java IO流 文件传输基础的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下,希望能给你带来帮助
    2021-07-07
  • HashMap确定key的存储位置的源码分析

    HashMap确定key的存储位置的源码分析

    HashMap 作为 Java 中最常用的数据结构之一,用于存储和管理键值对,HashMap 基于哈希函数实现,能通过将 key 映射到特定的位置来实现快速存储、查找和删除数据,接下来将从源码角度分析以通俗易懂的方式向大家讲解一下 HashMap 如何确定 key 的存储位置的
    2023-07-07
  • Java中对象的销毁方法分析

    Java中对象的销毁方法分析

    这篇文章主要介绍了Java中对象的销毁方法,较为详细的分析了对象的功能、用法及销毁对象对于程序运行的益处,需要的朋友可以参考下
    2015-04-04
  • JavaWeb之Filter与Listener使用解析

    JavaWeb之Filter与Listener使用解析

    这篇文章主要介绍了JavaWeb之Filter与Listener使用解析,Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一,过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能,需要的朋友可以参考下
    2024-01-01
  • Java中字符串截取方法详解及实际应用小结

    Java中字符串截取方法详解及实际应用小结

    java中截取字符串的常用方法是使用String类的substring方法,本文通过实例代码给大家介绍Java中字符串截取方法详解及实际应用小结,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • SpringMVC拦截器实现单点登录

    SpringMVC拦截器实现单点登录

    这篇文章主要介绍了SpringMVC拦截器实现单点登录,简单介绍了springmvc拦截器,单点登录实现原理等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 通过xml配置SpringMVC注解DispatcherServlet初始化过程解析

    通过xml配置SpringMVC注解DispatcherServlet初始化过程解析

    这篇文章主要为大家介绍了通过xml配置SpringMVC注解DispatcherServlet初始化过程解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Java分层概念详解

    Java分层概念详解

    这篇文章主要介绍了Java分层概念详解,内容十分详细,在这里给大家分享下,需要的朋友可以参考。
    2017-09-09

最新评论