gpt4 book ai didi

java - 使用 Java 为多个图像制作动画

转载 作者:行者123 更新时间:2023-11-30 07:13:14 25 4
gpt4 key购买 nike

我有一个关于动画 java 屏幕截图的问题。我的应用程序使用 robot() 函数和一个循环来截取多个屏幕截图并按连续顺序保存它们的名称,从 1 到循环编号。

问题是我需要将这些图像放入“电影”中,但格式并不重要。不幸的是,我不知道如何执行此操作,而且我在旅行时使用的是 iPad。

编辑:我的意思是我需要一些东西可以用我的 Java 应用程序用这些屏幕截图创建电影或动画。

最佳答案

您可以像这样在没有第三方库的情况下创建动画 GIF:

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

另见 http://docs.oracle.com/javase/7/docs/api/javax/imageio/metadata/doc-files/gif_metadata.html#gif_image_metadata_format .

关于java - 使用 Java 为多个图像制作动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19634293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com