使用Java动画多个图像 [英] Animating multiple images using Java
问题描述
我有一个关于动画java屏幕截图的问题。
我的应用程序正在使用 robot()
函数和一个循环来获取多个屏幕截图,并使用连续订单中的名称保存它们,循环编号为1。
I have a question about animating java screen shots.
My application is using the robot()
function and a loop to take multiple screenshots and save them with names in consecutive orders, 1 to the loop number.
我需要将这些图像放入电影中,但这种格式并不重要。不幸的是,我不知道如何做到这一点,我正在旅行时使用我的iPad。
The thing is I need to put those images into a "movie", the format doesn't matter all that much though. Unfortunately I have no clue how to do this and I'm on my iPad as I'm traveling.
编辑:我的意思是我需要的东西可以创造一个我的Java应用程序中包含这些屏幕截图的电影或动画。
What I mean is I need something that can create a movie or animation from my Java application with those screenshots.
推荐答案
您可以创建一个没有第三方库的动画GIF,如下所示:
You can create an animated GIF without a third-party library like this:
void writeAnimatedGif(OutputStream stream,
Iterable<BufferedImage> frames,
int delayInMilliseconds,
Integer repeatCount)
throws IOException {
try (ImageOutputStream iioStream =
ImageIO.createImageOutputStream(stream)) {
ImageWriter writer =
ImageIO.getImageWritersByMIMEType("image/gif").next();
writer.setOutput(iioStream);
writer.prepareWriteSequence(null);
for (BufferedImage frame : frames) {
writeFrame(frame, delayInMilliseconds, writer, repeatCount);
repeatCount = null;
}
writer.endWriteSequence();
writer.dispose();
}
}
void writeFrame(BufferedImage image,
int delayInMilliseconds,
ImageWriter writer,
Integer repeatCount)
throws IOException {
ImageTypeSpecifier type =
ImageTypeSpecifier.createFromRenderedImage(image);
IIOMetadata metadata = writer.getDefaultImageMetadata(type, null);
String format = metadata.getNativeMetadataFormatName();
Node tree = metadata.getAsTree(format);
if (repeatCount != null)
{
setRepeatCount(repeatCount, tree);
}
setDelayTime(delayInMilliseconds, tree);
metadata.setFromTree(format, tree);
writer.writeToSequence(new IIOImage(image, null, metadata), null);
}
private void setRepeatCount(Number repeatCount, Node imageMetadata)
{
Element root = (Element) imageMetadata;
ByteBuffer buf = ByteBuffer.allocate(3).order(ByteOrder.LITTLE_ENDIAN);
buf.put((byte) 1); // sub-block index (always 1)
byte[] appExtBytes = buf.putShort(repeatCount.shortValue()).array();
Element appExtContainer;
NodeList nodes = root.getElementsByTagName("ApplicationExtensions");
if (nodes.getLength() > 0) {
appExtContainer = (Element) nodes.item(0);
} else {
appExtContainer = new IIOMetadataNode("ApplicationExtensions");
Node reference = null;
nodes = root.getElementsByTagName("CommentExtensions");
if (nodes.getLength() > 0) {
reference = nodes.item(0);
}
root.insertBefore(appExtContainer, reference);
}
IIOMetadataNode appExt =
new IIOMetadataNode("ApplicationExtension");
appExt.setAttribute("applicationID", "NETSCAPE");
appExt.setAttribute("authenticationCode", "2.0");
appExt.setUserObject(appExtBytes);
appExtContainer.appendChild(appExt);
}
private void setDelayTime(int delayInMilliseconds, Node imageMetadata)
{
Element root = (Element) imageMetadata;
Element gce;
NodeList nodes = root.getElementsByTagName("GraphicControlExtension");
if (nodes.getLength() > 0) {
gce = (Element) nodes.item(0);
} else {
gce = new IIOMetadataNode("GraphicControlExtension");
Node reference = null;
nodes = root.getElementsByTagName("PlainTextExtension");
if (nodes.getLength() > 0) {
reference = nodes.item(0);
}
if (reference == null) {
nodes = root.getElementsByTagName("ApplicationExtensions");
if (nodes.getLength() > 0) {
reference = nodes.item(0);
}
}
if (reference == null) {
nodes = root.getElementsByTagName("CommentExtensions");
if (nodes.getLength() > 0) {
reference = nodes.item(0);
}
}
root.insertBefore(gce, reference);
}
gce.setAttribute("delayTime",
String.valueOf(delayInMilliseconds / 10));
}
这篇关于使用Java动画多个图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!