【问题标题】:Is there a way to change Gif speed有没有办法改变 Gif 速度
【发布时间】:2019-07-06 16:40:14
【问题描述】:

我想尝试以 gifspeed 保存保存,可能会显示一个带有速度选择的框,虽然我不太确定如何使用 java 更改 gif 速度。

我已经查过了,但无济于事。我是新人,如果这是一个问题,我很抱歉,我只是没有找到它


import base.AnimationExporter;
import java.awt.Dimension;
import java.awt.Graphics;
import settings.GuiDrawer;

public class SaveButton extends GuiElement
{
  public SaveButton(GuiMenu parent)
  {
    super(parent);
  }

  public void releasedOn(int posX, int posY, int button)
  {
    if (heldDown) {
      heldDown = false;
      AnimationExporter.saveAnimation(true);
    }
  }

}

编辑:我的坏继承人 AnimationExporter

   try {
     ImageWriter gifWriter = (ImageWriter)ImageIO.getImageWritersByFormatName("gif").next();
     ImageOutputStream outputStream = ImageIO.createImageOutputStream(outputFile);
     gifWriter.setOutput(outputStream);

     ImageTypeSpecifier imageType = ImageTypeSpecifier.createFromBufferedImageType(2);
     IIOMetadata metadata = gifWriter.getDefaultImageMetadata(imageType, null);
     IIOMetadataNode nodeTree = (IIOMetadataNode)metadata.getAsTree(metadata.getNativeMetadataFormatName());

     IIOMetadataNode appExtensionsNode = getNode("ApplicationExtensions", nodeTree);
     IIOMetadataNode child = new IIOMetadataNode("ApplicationExtension");
     child.setAttribute("applicationID", "NETSCAPE");
     child.setAttribute("authenticationCode", "2.0");

     child.setUserObject(new byte[] { 1, (byte)((Editing.animationLoop ? 0 : 1) & 0xFF), (byte)((Editing.animationLoop ? 0 : 1) >> 8 & 0xFF) });
     appExtensionsNode.appendChild(child);

     metadata.setFromTree(metadata.getNativeMetadataFormatName(), nodeTree);

     gifWriter.prepareWriteSequence(null);
     for (Frame frame : animation.Animation.frames) {
       IIOMetadata imageMetadata = gifWriter.getDefaultImageMetadata(imageType, null);
       IIOMetadataNode imageNodeTree = (IIOMetadataNode)imageMetadata.getAsTree(imageMetadata.getNativeMetadataFormatName());
       IIOMetadataNode graphicNode = getNode("GraphicControlExtension", imageNodeTree);
       graphicNode.setAttribute("disposalMethod", "none");
       graphicNode.setAttribute("userInputFlag", "FALSE");
       graphicNode.setAttribute("delayTime", Integer.toString(delay));

       imageMetadata.setFromTree(imageMetadata.getNativeMetadataFormatName(), imageNodeTree);

       IIOImage currentImage = new IIOImage(frame.getEntireFrame(), null, imageMetadata);
       gifWriter.writeToSequence(currentImage, null);
     }
     gifWriter.endWriteSequence();
     outputStream.close();
   } catch (Exception e) {
     e.printStackTrace();
   }
 }```

【问题讨论】:

  • base.AnimationExportersettings.GuiDrawer 都不是 Java API 类,它们的包名是非描述性的,所以我们不知道它们是什么。因此不清楚你在这里问什么。
  • 请将您的代码以minimal reproducible example 的形式发布,我们可以使用它来重现您的问题。您发布的代码不完整,但还包含许多不相关的部分。这就是说 - 在这一行中 delayTime 是什么`graphicNode.setAttribute("delayTime", Integer.toString(delay));`?这似乎是这里的症结所在。

标签: java gif


【解决方案1】:

“GIF”的帧速率已嵌入。但是,您可以通过外部工具加快或减慢速度。 Photoshop 可能效果最好。 This 工具或许能帮到你。如果您需要动态帧速率更改,我们需要有关您正在使用的库的更多信息。

【讨论】:

    【解决方案2】:

    啊,对不起,我以为我抄的少了,现在看我感觉很愚蠢,delayTime这里是,

    public int delay = Editing.frameDelay; 我认为frameDelay 是我应该改变的 public static int frameDelay = 100;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      • 2011-01-09
      • 1970-01-01
      • 2021-09-27
      • 2012-03-29
      • 2020-05-15
      相关资源
      最近更新 更多