`
Qin-Qin
  • 浏览: 24826 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

让Swing正确显示Gif

阅读更多

利用gif图片制作简单动画是常用的渲染手段,swing虽然支持gif图片格式并可以自动地实现动画效果。
通常最简单地将gif图片放到swing组件上是调用JButton或JLabel的setIcon(Icon icon)方法。
还有一种方法是重写paintComponent(Graphics g)或paint(Graphics g)方法。例如
public class ShowGifPanel extends JPanel{
    ImageIcon image = new ImageIcon("/root/opt/loading.gif");

    @Override
    public void paint(Graphics g) {
        g.drawImage(image.getImage(), 0, 0, this);
    }
}
通过上述方法呈现如下3个gif。

但是事实情况却是:不要企图通过这样简单的处理达到理想的效果。如果你这样做的话马上会发现gif的刷新率往往非常快,看上去gif图片桢刷新很快,或者应该说太快了。
swing还提供了一种实现手段是设置一组相似的gif,通过轮循显示来呈现,通过下图就明了了。

这样虽然可以呈现,但是对于一个动画来说就必须提供多个gif。对于占用空间和给美工的负担都不利。

如果你使用SWT呈现Gif,Eclipse提供了一个方案。
http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.swt.snippets/src/org/eclipse/swt/snippets/Snippet141.java?view=co
其基本原理就是将Gif的各个桢轮循地显示,如果你以这个程序运行loading.gif,看上去还是很快,可以通过修改第131~137行之间的代码来调节刷新率。这样SWT就能完美实现处理Gif了。
不幸的是,将SWT的那种方式移植到Swing中却达不到很好的效果。在Swing中要想完美实现处理Gif需要额外的一些工作。

首先需要对Gif这种图片格式有一些基本认识。
第一:Gif由一系列Image组成,也就是桢,Gif动画就是连续地显示这些桢,但是这还不够。
第二:无论某一时刻轮循到哪一桢,第1桢,总是要当作背景画出来,而且第1桢也是所有桢当中最长最高的,它的尺寸也是整个Gif图象的尺寸,位置从(0, 0)开始,其余各桢可能只是描述与相临各桢变化的部分,所以长和高要小且不完整,起始位置是该桢相对整体背景的位置。(这点SWT也是这样做的)
第三:Gif动画连续显示不一定是各个桢轮循单独显示,而是不仅仅显示当前该显示的桢,还要向前追溯到"第一桢",从"第一桢"开始到当前应该显示的桢组成的连续一系列"桢簇",所以某一时刻单单显示背景和当前桢是不够的,而是显示背景和当前"桢簇"。""桢簇""是我自己取的名字,而且我看SWT轮循的例子中并没有用到"桢簇",而是传统的单桢轮循。但是同样的方法对Swing不奏效,现在我对此还不得其解。关于"第一桢",是和com.sun.imageio.plugins.gif.GIFImageMetadata类的disposalMethod属性有关,在SWT中这个属性是org.eclipse.swt.graphics.ImageData.disposalMethod。disposalMethod据我的研究是描述处理桢的方法,常见的disposalMethod取值有none(取值0,不处理)、Background(取值2,背景)两种,所谓的当前桢的"第一桢"就是向前追溯到最近的disposalMethod取值为2的那一桢的下一桢,也就是说或者"第一桢"的前一桢的disposalMethod取值为2,或者"第一桢"就是Gif索引为2的桢,因为Gif的第1桢总要当背景显示。
第四:桢的元数据在SWT中用org.eclipse.swt.graphics.ImageData类封装,在Swing中对应的是com.sun.imageio.plugins.gif.GIFImageMetadata(可是截止到JDK6.0 u11,这个类的版本号还是0.5,有些另人失望:(),可以通过次类获取到delayTime这个属性,也就是下一桢的间隔时间,但是有很多Gif,这个值总是0,所以Swing显示频率相当的快。

以下是本人写的2个参考实现,其中GifAnalysis.java是gif的分析工具,它将Gif的各个桢单独拿出来分析比对,并列出了上面提到的一些属性。如下图

通过比较发现loading.gif各个桢的delayTime均为0,因此单纯地将loading.gif设置为JLabel等组件的icon属性效果必定会出问题,可以通过美工解决。

Gif.java是呈现gif的参考,需要留意构造函数public Gif(File gifFile, int delayFactor),第二个参数是延时因子,数值越大每一桢的间隔就越长,对于loading.gif该值调节为105较为合适,而tt1.gif和javafx-loading-100x100.gif这个值应该是10。

分享到:
评论

相关推荐

    java-swing编程(一个简单的图片查看器).

    ### Java Swing 编程:构建一个简易图片查看器 Java Swing 是 Java 平台上的一个图形用户界面(GUI)工具包,提供了丰富的组件用于创建桌面应用程序。本文将深入解析如何利用 Java Swing 构建一个简单但功能完备的...

    透明gif的显示

    标题中的“透明gif的显示”指的是在编程环境中如何正确地展示具有透明度的GIF图像。GIF是一种支持透明度的图像格式,它允许图片的一部分是透明的,使得背景或其他元素能够透过这部分图像显示出来。这在网页设计、...

    java-swing编程小试牛刀之图片查看器

    为了正确显示图片,需要重写`paintComponent`方法。 - 在`paintComponent`方法中,首先调用`super.paintComponent(g)`以确保默认的绘制行为正常执行。 - 根据图片是否为空,决定是否绘制图片。例如,如果`image`...

    缺少文件这个小demo可以实现显示gif的图片效果一定要导入里边的那个工具jar包.rar

    总结,要实现Java中显示GIF图片的效果,关键在于选择合适的库,并正确地引入和使用。这个DEMO项目应该包含了必要的代码示例,通过研究和调试,你不仅可以解决当前问题,还能深入理解Java中图像处理的相关技术。

    基于Java的源码-Jav动画图标源码(显示GIF图像).zip

    这个"基于Java的源码-Jav动画图标源码(显示GIF图像).zip"压缩包很可能是提供了一种实现方式来在Java应用中展示动态GIF图片。下面将详细介绍这个主题,包括核心知识点和可能的实现方法。 首先,Java本身并不直接...

    基于java的Jav动画图标源码(显示GIF图像).zip

    3. **AWT或Swing组件**:Java AWT和Swing提供了图形用户界面的构建块,可以创建组件来显示图片。开发者可能会创建一个自定义组件,覆盖`paintComponent`方法,每次重绘时根据当前帧来绘制对应的图像。 为了在实际...

    基于Java的实例开发源码-Jav动画图标源码(显示GIF图像).zip

    本实例源码着重于如何使用Java来显示GIF动画图像,这在需要动态内容的GUI应用中非常有用。GIF是一种支持多帧动画的图像格式,非常适合用于制作简单的动态效果。 首先,要理解在Java中处理GIF图像的关键是使用`javax...

    java源码:Jav动画图标源码(显示GIF图像).rar

    开发者可能需要处理缩放和裁剪问题,确保动画在各种尺寸下都能正常显示。 在研究这个源码时,你将学习到如何在Java中处理图像流,理解GIF文件格式,以及如何在GUI中实现动态元素。此外,通过阅读代码,你还可以了解...

    SwingHacks学习笔记(2)-----自定义JLabel,JButton

    另外,文章可能还涉及到了背景图片的使用,如“backgroud.gif”。在Swing中,我们可以为组件设置背景图片,这通常通过覆盖`paintComponent(Graphics g)`方法并在其中绘制背景图片来实现。在该方法中,使用`Graphics`...

    java swing 日期控件

    4. **绘图和渲染**:如果控件需要自定义的视觉效果,可能需要使用Graphics类进行绘制,或者利用Swing的CellRenderer来定制组件的显示。 5. **国际化和本地化**:考虑到不同地区的日期格式和习惯,控件可能需要支持...

    GifDemo:在线加载并显示GIF动态图

    为了正确显示GIF动画,通常需要使用`javax.swing.JLabel`配合`javax.swing.timer.Timer`来更新每帧图像。或者使用`javafx.scene.image.Image`和`javafx.scene.media.MediaPlayer`在JavaFX环境中处理GIF。 7. **优化...

    java swing 日期控件(修正上次缺少jar包的bug)

    总的来说,这个Java Swing日期控件资源包含了一个自定义的日期选择组件,可能由`DatePicker` 和 `DateField` 类实现,采用`AbsoluteLayout` 进行布局管理,并通过`dropdown.gif` 提供交互式日历显示。修复了缺失jar...

    gif动画等待线程.rar_等待 动画

    在这个上下文中,"等待线程"是指一个独立运行的线程,它的任务是显示GIF动画,告知用户程序正在后台执行任务。当主线程执行耗时操作时,等待线程会保持用户界面的活跃,防止用户认为程序已经崩溃或卡住。 实现这样...

    java窗体 实现图片拖动 实例代码

    5. **GIF支持**:如果文件列表中的`1.GIF`表示我们处理的是GIF格式的图片,那么我们需要确保`ImageIcon`能够正确处理动画GIF。Java标准库默认的`ImageIcon`可能无法播放动画,因此可能需要第三方库如`javax.swing....

    指定路径图片浏览器

    当然,更改后缀名时,用户需要注意,不同的扩展名可能对应不同的图片格式,错误的转换可能会导致图片无法正常显示。 在实际应用中,"指定路径图片浏览器"可以广泛应用于各种场景。比如,摄影师在整理拍摄的照片时,...

    (完整word版)Java课程设计的图片浏览器的讲解.doc

    这样可以确保图片在不同尺寸的屏幕上都能正确显示。 详细设计部分,程序设计流程包括文件和目录的查找、图片的筛选、以及图片的加载和显示。MyFilter类实现了FilenameFilter接口,用于过滤指定目录下的特定扩展名...

    载入进度对话框

    描述中的关键点在于"支持自定义的gif图片作为载入对话框的动画",这表明我们可以根据需求和品牌风格来定制对话框的视觉表现。GIF(Graphics Interchange Format)是一种流行的图像格式,尤其适合创建循环动画。在...

    设置动画光标(java)

    每张图片代表光标的帧,这些帧将在一定间隔内循环显示,形成动画效果。通常,这些图像序列以.gif或.gif格式存储,因为它们支持动画。 3. **`ImageIcon` 类** `javax.swing.ImageIcon`类用于加载和显示图像资源。你...

    java中插入图片

    在Java图形用户界面(GUI)编程中,经常需要在程序中插入并显示图片。本文将详细介绍如何在Java应用程序中加载和显示图片,并通过一个具体的示例代码进行解析。 #### 二、基础知识 在Java中,通常使用`java.awt....

    Java图形验证码,支持gif、中文、算术等类型,可用于Java Web、JavaSE等项目.zip

    - **GIF动图验证码**:通过生成动态的验证码图片,增加机器识别的难度,因为每个帧可能包含不同的部分验证码。 - **中文验证码**:使用中文字符作为验证码内容,增加了破解的复杂性,因为中文字符集比英文大得多。...

Global site tag (gtag.js) - Google Analytics