【发布时间】:2015-09-04 20:18:23
【问题描述】:
给定BufferedImage 中的真彩色全帧列表和帧持续时间列表,我怎样才能无损地创建一个图像,当它放在 JLabel 上时会产生动画?
根据find 的能力,我可以创建一个ImageWriter 包装ByteArrayOutputStream,将IIOImage 帧写入其中,然后将Toolkit.getDefaultToolkit().createImage 流写入ToolkitImage。
这个尝试有两个问题。
- ImageWriter 只能使用已知的图像编码器之一进行实例化,并且没有无损真彩色动画图像格式(例如MNG),
- 它对图像进行编码(压缩),然后再次对其进行解压缩,从而对性能造成不必要的危害。
[编辑]
一些更简洁的约束和要求。请不要想出任何违反这些规则的东西。
我不想要什么:
- 制作动画线程并自己绘制/更新动画的每一帧,
- 使用任何类型的第 3 方库,
- 借用任何外部进程,例如网络浏览器,
- 在某种视频播放器对象或 3D 加速场景 (OpenGL/etc) 中显示它,
- 直接使用
sun.*包中的类
我做想要什么:
- 帧大小可以和监视器一样大。请不要担心性能。我会担心的。您只需要担心正确性。
- 所有框架都具有相同的大小,
-
Image子类。我应该能够像g.drawImage(ani, 0, 0, this)那样绘制图像并且它会动画,或者将其包装在ImageIcon中并在JLabel/JButton/etc 上显示它并且它会动画, - 每一帧都可以有不同的延迟,从 10 毫秒到一秒不等,
- 动画可以循环或结束,每个动画定义一次(就像 GIF 一样),
- 我可以使用任何与 Oracle Java 8 打包的东西(例如 JavaFX),
- 无论发生什么,它都应该与 SWING 集成
可选:
- 框架可以具有透明度。如果需要,我可以预先对图像进行不透明处理,因为无论如何动画都会在已知背景(单色)上显示。
- 我不在乎是否必须自己继承
Image并在其中添加一个与ImageObserver合作的动画线程,或者编写我自己的InputStreamImageSource,但我不知道如何。 - 如果我能以某种方式显示一个 JavaFX 场景,其中包含一些 HTML 和 CSS 代码来为我的图像设置动画,那也很好。但只要它全部封装在一个我可以传递的与 SWING 兼容的对象中。
【问题讨论】:
-
我不会使用 JLabel。我会使用paintComponent 方法直接在JPanel 上绘制图像。你的图片有多大?
-
图像大小可以是从图标到显示器分辨率的任何东西(不能更大)。我实际上并不需要 JLabel(我将不得不重写我当前使用 JLabel 的一个应用程序)但主要是,我要求 JLabel 兼容性是一种简单的表示方式:一个包含所有帧的
(Toolkit)Image。跨度> -
不同尺寸的图片,动画更加跳跃。您希望每张图片显示多长时间?