見出し画像

【P5 Tips】 静止画保存のファイル名にタイムスタンプを使おう

Processing では save 関数を使うことでディスプレイ出力を jpg や png などの静止画ファイルとして保存できます。

一般的には「キーボードで特定のキーが押されたら静止画保存する」という実装をすることが多いんじゃないかと思います。 このとき、保存するファイル名をベタ書きしていると同じ名前のファイルが既に存在している場合に元あったファイルを上書きしてしまいます。

適宜リネームして…等するのは流石に面倒ですし、「せっかく激エモなジェネが生成されたのに、キー連打してファイルを上書きしてしまった!」なんてことになったら大変です。 失われたジェネは二度と戻ってきません。 そうならないために、ファイル名に現在時刻を含めてユニークにすることで上書きされないようにすることをオススメします。

ここでは2つの方法を紹介します。

System.currentTimeMillis 関数を使う

最もシンプルなのは System.currentTimeMillis 関数を使う方法です。 System.currentTimeMillis 関数は現在時刻(1970年からの経過ミリ秒)を返すので、これをファイル名に付け加えてあげることで重複しないユニークなファイル名にすることができます。

次の例では現在時刻の文字列を返す timestamp 関数を定義して、特定のキーが押された際にファイル名を動的に作って保存するようにしています。 (setup 関数や draw 関数の中身はここでは重要でないのでスルーして OK です。)

void setup() {
  size(480, 120);
  textSize(42);
  textAlign(CENTER, CENTER);
  stroke(255);
}

void draw() {
  background(20, 30, 40);
  translate(width/2, height/2);
  text(timestamp(), 0, 0);
}

void keyPressed() {
  if (key == 's') {
    // s キーが押されたらディスプレイ出力を保存する
    save("dist/sketch-" + timestamp() + ".png");
  }
}

// 現在時刻を文字列で返す関数を定義
String timestamp() {
  return String.valueOf(System.currentTimeMillis());
}

これで保存するたびに異なるファイル名で静止画を保存することができます。

Date クラスと SimpleDateFormat クラスを使う

System.currentTime 関数を使う方法でも十分使えますが、ファイル名に数字列が並ぶのでパッと見ていつ保存されたものなのか分かりにくいという問題があります。 もしこれを避けたければ、Date クラスと SimpleDateFormat クラスを使用して人間の読みやすいフォーマットに変換しましょう。

先程の例を次のように変更します。

import java.util.Date;  // 追加
import java.text.SimpleDateFormat;  // 追加

void setup() {
  size(480, 120);
  textSize(42);
  textAlign(CENTER, CENTER);
  stroke(255);
}

void draw() {
  background(20, 30, 40);
  translate(width/2, height/2);
  text(timestamp(), 0, 0);
}

void keyPressed() {
  if (key == 's') {
    save("dist/sketch-" + timestamp() + ".png");
  }
}

String timestamp() {
  // timestamp の実装を変更
  Date date = new Date();
  SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd-HHmmss-SSS");
  return sdf.format(date);
}

これでファイル名をより人間の読みやすいフォーマットにすることができます。

【番外編】 saveFrame 関数を使う場合

saveFrame 関数はファイル名に "sketch-####.png" 等を指定することで連番で保存してくれるので、1回の実行においてはファイル名が重複することはありませんが、複数回実行した場合にファイル名が重複する可能性はあります。

この場合には次のように、プログラムの起動時に一回だけ現在時刻を取得してファイル保存するフォルダ名にしてしまうのをオススメします。

import java.util.Date;
import java.text.SimpleDateFormat;

// 起動時刻を保持しておく
String startTimestamp = timestamp();

void setup() {
  size(480, 120);
  textSize(42);
  textAlign(CENTER, CENTER);
  stroke(255);
}

void draw() {
  background(20, 30, 40);
  translate(width/2, height/2);
  text(timestamp(), 0, 0);
  
  // 毎フレーム保存
  saveFrame("dist/" + startTimestamp + "/sketch-####.png");
}

String timestamp() {
  Date date = new Date();
  SimpleDateFormat sdf = new SimpleDateFormat("yyMMdd-HHmmss-SSS");
  return sdf.format(date);
}

こうすると、起動するたびに異なるフォルダが作成されるので、ファイル名が重複せず、ファイルの管理も楽になります。


これで気軽に静止画保存しまくって、出力した中からお気に入りの1枚を見つけ出すことができます!  なにか不明点などありましたらコメントか @tapioca_mart までお気軽にご質問ください。

(Processing 触り始めたばかりなのでもっといい方法があれば是非教えてください!)

この記事が気に入ったらサポートをしてみませんか?