【问题标题】:Exporting a gif from a Processing sketch w/ Gif-animation library从带有 Gif 动画库的处理草图中导出 gif
【发布时间】:2014-04-03 03:50:07
【问题描述】:

我想将我的一个处理草图导出为 gif 格式,并使用 extrapixel 的 Gif 动画库 (http://extrapixel.github.io/gif-animation/) 来执行此操作。

我能够导出正确数量的帧,但它们似乎都是空的。
任何想法为什么会发生这种情况?

import gifAnimation.*;

GifMaker gifExport;

float angle = 0.1;

void setup() {
  size(500, 500);
  smooth();
  noStroke();
  background(0);

  frameRate(12);
  gifExport = new GifMaker(this, "spin rect sine growth.gif");
  gifExport.setRepeat(0); // make it an "endless" animation
  gifExport.setTransparent(255); // make white the transparent color -- match browser bg color
}

void draw() {

  float size = map(sin(angle),-1,1,0,height);
  rectMode(CENTER);
  translate(width/2, height/2);
  rotate(angle);
  noStroke();
  fill(255,255);
  rect(0,0, size, size);
  angle += 0.0523 ;

  noStroke();
  fill( 0, 15);
  rect(0, 0, width, height);

  gifExport.setDelay(0);  //maybe no delay?
  gifExport.addFrame();

  if (frameCount == 120) gifExport.finish();  
}

【问题讨论】:

  • 我觉得我应该为在使用特定库时提出问题而道歉——这可能会使我的整个帖子过于具体。如果是这样,我很抱歉
  • 当你说出现空,你的意思是白色吗?在白色背景上?
  • 你为什么使用gifExport.setDelay(0);?你不想在 gif 的帧之间有一点延迟吗?
  • 我很尴尬地承认我只包含 gifExport.setDelay(0) 是为了模仿库中包含的示例代码。

标签: animation export processing gif


【解决方案1】:

Kevin 的建议很好。如果您将帧速率设置为 12,也许您还应该将延迟设置为 1000/12。

import gifAnimation.*;

GifMaker gifExport;

float angle = 0.1;

void setup() {
  size(500, 500);
  smooth();
  noStroke();
  background(0);

  frameRate(12);
  gifExport = new GifMaker(this, "spin rect sine growth.gif");
  gifExport.setRepeat(0); // make it an "endless" animation
  gifExport.setTransparent(255); // make white the transparent color -- match browser bg color
  gifExport.setDelay(1000/12);  //12fps in ms

}

void draw() {

  float size = map(sin(angle),-1,1,0,height);
  rectMode(CENTER);
  translate(width/2, height/2);
  rotate(angle);
  noStroke();
  fill(255,255);
  rect(0,0, size, size);
  angle += 0.0523 ;

  noStroke();
  fill( 0, 15);
  rect(0, 0, width, height);

  gifExport.addFrame();

  if (frameCount == 120) gifExport.finish();  
}

我已经测试过,它似乎工作得很好:

在某种程度上,gifAnimation 库很方便,因为它为您处理编码帧,但请注意这里和那里有一些错误的帧。

如果您想完全控制帧,您可以导出图像序列并使用Image Magick 之类的东西将序列转换为 gif。我可以想到几个优点:

  1. 如果您将帧保存在单独的线程中,您的导出速度会更快/不会对处理的主动画线程产生太大影响
  2. 你的帧会很清晰(假设你在没有太多压缩的情况下保存,因为这个 png 效果最好)
  3. 根据您的动画内容,您可以optimize your gif,这样加载时对网络/设备更友好。

这是另一个没有故障的 gif:

它一直在使用此代码导出:

float angle = 0.1;

void setup() {
  size(500, 500);
  smooth();
  noStroke();
  background(0);

  frameRate(12);
}

void draw() {

  float size = map(sin(angle),-1,1,0,height);
  rectMode(CENTER);
  translate(width/2, height/2);
  rotate(angle);
  noStroke();
  fill(255,255);
  rect(0,0, size, size);
  angle += 0.0523 ;

  noStroke();
  fill( 0, 15);
  rect(0, 0, width, height);

  if(frameCount <= 120){
    TImage frame = new TImage(width,height,RGB,sketchPath("frame_"+nf(frameCount,3)+".png"));
    frame.set(0,0,get());
    frame.saveThreaded();
  }
}
class TImage extends PImage implements Runnable{//separate thread for saving images
  String filename;

  TImage(int w,int h,int format,String filename){
    this.filename = filename;
    init(w,h,format);
  }

  public void saveThreaded(){
    new Thread(this).start();
  }

  public void run(){
    this.save(filename);
  }

}

并且通过导航到草图文件夹并运行来转换图像序列

convert *.png spin_anim.gif

如果你只是想调整它的大小:

convert spin_anim.gif -resize 100x100 spin_anim_small.gif

HTH

【讨论】:

  • 这是一个非常有用的评论。非常感谢您关于导出图像序列并从中创建 gif 的建议。我检查了 ImageMagick,但因为命令行仍然让我感到害怕,所以我在 Photoshop 中编译它。
  • 如果你有时间,你介意带我看看最终的 if 语句和 TImage 类中到底发生了什么吗?我不熟悉线程的概念(在线论坛和电子邮件/消息之外)。
  • 很高兴它有帮助。用几句话在新手级别上难以解释:第一个接口。它们就像协议:接口只有方法/函数签名,但没有实际实现。由实现/同意接口的类来提供实现(实际上是做某事)。在 TImage 的例子中,Runnable 是一个 java 语言已经定义的接口,这意味着任何实现它的东西都必须提供一个公共的 void run() 方法。这与 Thread 类一起工作,因为您可以从任何实现 Runnable 的实例中实例化线程...
  • 您需要计算能力/时间来执行编码和将图像字节保存到磁盘以及在屏幕上呈现等任务。使用单个线程(默认情况下处理的动画线程)意味着您尝试同时完成两个任务,但是您会在另一个之后发生一件事:渲染帧,将其保存到磁盘,如果处理想要移动到下一帧,它不能直到它完成写入磁盘。启动一个单独的线程并不能节省您的处理能力,它只是允许您在绘图的同时进行保存,因此动画不会滞后太多......
  • ...试试这个:if(frameCount &lt;= 120){ get().save(sketchPath("frame_"+nf(frameCount,3)+".png")); } 而不是 TImage 版本,你会明白我的意思
猜你喜欢
  • 2017-02-12
  • 2013-12-22
  • 2016-08-23
  • 2019-08-11
  • 2013-12-17
  • 2018-08-29
  • 1970-01-01
  • 2018-03-24
相关资源
最近更新 更多