すのものの自作壁紙(その3)

1ドット×1ドットの.gifファイルだが、色が次々と変わってゆくものである。 元にした.bmpファイルは自作プログラムで出力させたものなので、 私の解析が間違っていた場合、 .gifファイルが"悪さ"をするかもしれない。

次のプログラムは、 1ドット×1ドットの.bmpファイルを306個出力する。 サイズはいずれも58バイト。 それらの名前は0000.bmp, 0001.bmp, ..., 0305.bmpである。 色は、 青→シアン→緑→黄→赤→マゼンタ→青と徐々に変わってゆくようになっている。 (隣りあったファイルの間では、どれかの色が5だけ変わるようになっている。)

(256×256×256に小さな立方体を積み、 座標(r, g, b)に当たる立方体は(赤、緑、青)が(r, g, b)である色で塗ったとする。 この全体を(255,255,255)のほうから見ると正六角形になるが、 その輪郭をたどって一周するように色は変わってゆく。)

#include <stdio.h>
#include <stdlib.h>

char str[] = \
    "\x42\x4d\x3a\x00\x00\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00" \
    "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x18\x00\x00\x00" \
    "\x00\x00\x04\x00\x00\x00\xc4\x0e\x00\x00\xc4\x0e\x00\x00\x00\x00" \
    "\x00\x00\x00\x00\x00\x00";

    /* ↑ 1×1の .bmp ファイルの先頭に書いてあるもの */

main() {
    int i, j;
    char fname[128+1];
    FILE* out;

    for (i = 0; i < 306; i++) {
        sprintf(fname, "%04d.bmp", i);
        if ((out = fopen(fname, "wb")) == NULL) {
            fprintf(stderr, "can't open %s.\n", fname); exit(1);
        }

        for (j = 0; j < sizeof(str) - 1; j++) {
            fputc(str[j], out);
        }

                                        /* 色の指定。青、緑、赤の順 */
        if (i <= 51) {
            fprintf(out, "%c%c%c", 255, 5*i, 0);
        } else if (i <= 102) {
            fprintf(out, "%c%c%c", 255-5*(i-51), 255, 0);
        } else if (i <= 153) {
            fprintf(out, "%c%c%c", 0, 255, 5*(i-102));
        } else if (i <= 204) {
            fprintf(out, "%c%c%c", 0, 255-5*(i-153), 255);
        } else if (i <= 255) {
            fprintf(out, "%c%c%c", 5*(i-204), 0, 255);
        } else {
            fprintf(out, "%c%c%c", 255, 0, 255-5*(i-255));
        }
        fputc(0, out);          /* そのあと、最後に 0 が1バイトついている */
        fclose(out);
    }
}

ホームページ・ビルダー 6.5.2.0 を起動し、 「ツール」「ウェブ アニメータの起動」 「アニメーション ウィザード」 「複数の画像ファイルを使用してアニメーションを作成」。 「画像の追加」で全部を選択してしまう。

なぜか

の順に並ぶので、0305.bmpを最後に、0000.bmpを最初に移動する。 (そういうボタンがついている。)

一枚の画像を1ミリ秒ずつ表示するようにしたのがkawaridama1.gif, defaultの500ミリ秒ずつにしたのがkawaridama2.gif, 60000ミリ秒ずつにしたのがkawaridama3.gifである。 いずれも、背景にそれぞれの.gifファイルを敷いている。 (ブラウザによっては.gifファイルが"動かない"、 すなわち、最初の画像の色である青が表示されたままということも起こるようである。)

単純に計算すれば一つ目のは0.3秒ほどで色が一巡するはずだが、 実際には約30秒かかる。 二つ目のは約150秒なので計算と合う。 三つ目のは計算によれば305分、すなわち約5時間で一周する。 (一周することは確認したが、時間は計らなかった。)

次のプログラムは、 色が1ずつ変わり、全部で1530個のファイルを出力する。 (数値が違うだけなのでコメントは省略した。)

#include <stdio.h>
#include <stdlib.h>

char str[] = \
    "\x42\x4d\x3a\x00\x00\x00\x00\x00\x00\x00\x36\x00\x00\x00\x28\x00" \
    "\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x18\x00\x00\x00" \
    "\x00\x00\x04\x00\x00\x00\xc4\x0e\x00\x00\xc4\x0e\x00\x00\x00\x00" \
    "\x00\x00\x00\x00\x00\x00";

main() {
    int i, j;
    char fname[128+1];
    FILE* out;

    for (i = 0; i < 1530; i++) {
        sprintf(fname, "%04d.bmp", i);
        if ((out = fopen(fname, "wb")) == NULL) {
            fprintf(stderr, "can't open %s.\n", fname); exit(1);
        }

        for (j = 0; j < sizeof(str) - 1; j++) {
            fputc(str[j], out);
        }

        if (i <= 255) {
            fprintf(out, "%c%c%c", 255, i, 0);
        } else if (i <= 510) {
            fprintf(out, "%c%c%c", 255-(i-255), 255, 0);
        } else if (i <= 765) {
            fprintf(out, "%c%c%c", 0, 255, i-510);
        } else if (i <= 1020) {
            fprintf(out, "%c%c%c", 0, 255-(i-765), 255);
        } else if (i <= 1275) {
            fprintf(out, "%c%c%c", i-1020, 0, 255);
        } else {
            fprintf(out, "%c%c%c", 255, 0, 255-(i-1275));
        }
        fputc(0, out);
        fclose(out);
    }
}

「画像の追加」はなぜか一度には 371 ファイルが限界だった。 しかたがないので、何回かに分けて追加した。 上と似た、ファイル順が狂う現象が起きるので、こんどは手作業でファイルを上下。 "つまんで"おいて、枠の外に"ひっぱる"とスクロールが始まるので、 行きすぎないように、間違った位置に置かないように注意しながらマウスボタンを押し続けた。 追加されるファイルは選択しておいたファイルの前後に挿入される仕様のようで、 うっかり間違ったファイルが選択された状態で追加してしまい、 間違った位置にごそっと挿入されてしまったときは削除ボタンを連打して削除した。

今回は、一枚の画像につき20000ミリ秒ずつとした。 計算の上では、ちょうど8.5時間で一周することになる。 ほぼ一日の勤務時間と同じになることを考慮した。 .gifファイル作成中の画面で、ファイル数が1530と表示されたので、 数はあっていたようだ。 祈るような気持ちで待つ。 (上の「祈るような気持ち」は実際に待っている間に打った。)

できたのがkawaridama4.gifである。


すのもの Sunomono