2017年9月29日金曜日

LibreOffice Draw でアニメーション作製

先週、っていうか、先々週かな? How to fold IKEA poncho. IKEAポンチョのたたみ方。 で、アニメーションを作った。
このアニメーションは、Linux(Lubuntu)上でLibreOffice Draw(以下 Draw と省略)を使って書いた絵を .bmp で保存して、それら画像ファイルをimagemagicのconvertコマンドでGIFアニメーションに変換した。
簡単に入手できるツールで、さくっと作れた。良い時代になったものだ。

Draw上で、1ページ、1コマとして絵を書いた。
最初に描いた絵をページごとコピーして、それを少し変更して…の繰り返しでそれぞれの絵を用意する。
何枚もの絵を用意するが、それぞれほんの少しの変更なので、意外と簡単に描けた。
20日の帰宅後に書き始めて、2時間ぐらい。品質にこだわらなければその程度だ。
自由曲線の制御点をちょいちょい動かしたり、曲率を変えたりの作業なので、あまり手間がかからない。
慣れればもっと速くなるだろう。

しかし、面倒なこともあった。
.bmpに限らず、画像形式でのエクスポートは、1ページ単位で行うことになる。
ページを選択して、メニューから、「ファイル」->「エクスポート」を選んで、エクスポートダイアログ上で、「BMP - Windows bitmap(.bmp)」を選んで、適切なファイル名(連番の数字)を指定して、「OK」をクリックする。BMPオプションダイアログが表示されるので、そこでまた「OK」ボタンを押す。

コマ数が10コマ程度なので、すべて手動で1ページずつ行ったが、私は超おっちょこちょい男なので、何度も失敗し、イライラした。

イライラしたら、精神衛生上良くない。
マクロを組もうかなとも思ったが、その時はやらなかった。

しかし、プログラマなのだから、やっぱり組もうと、今週になって決断した。
昨日の夜から調べ始め、今日の朝から実装作業を始めた。
Excelでのマクロや、VBでの開発の経験はあるが、Libreofficeでの開発は初めてだ。
Drawはマクロ記録機能もないし、実装方法は大きく分けて3種類あるらしい。無駄にややこしい。調べれば調べるほどわからないことが出てきて、深みにハマる。
とはいえ、午前中になんとか動くものができた。
sub SavePagesAsBMP
    dim doc  as Object

    dim dirDialog as Object
    dim ucb as Object
    dim directory as String

    dim controller as Object
    dim pages      as Object
    dim prevCurrentPage as Object
    dim args(1) as new com.sun.star.beans.PropertyValue

    GlobalScope.BasicLibraries.LoadLibrary("Tools")
    doc = ThisComponent

    '---------------------------'
    '     Select directory      '
    '---------------------------'
    dirDialog = CreateUnoService( "com.sun.star.ui.dialogs.FolderPicker" )
    ucb = createUnoService("com.sun.star.ucb.SimpleFileAccess")

    directory = DirectoryNameoutofPath(doc.getURL(),"/")
    if ucb.Exists( directory ) then
        dirDialog.SetDisplayDirectory( directory )
    end if

    if dirDialog.Execute() <> 1 then
        exit sub
    end if

    directory = dirDialog.getDirectory
 
    '---------------------------'
    '  Save each page as .BMP   '
    '---------------------------'
    controller = doc.CurrentController
    pages = doc.drawPages

    args(0).Name = "FilterName"
    args(0).Value = "draw_bmp_Export"

    prevCurrentPage = controller.getCurrentPage  ' preserve current page

    for i=0 to pages.Count -1
        controller.setCurrentPage( pages(i) )
        'url = directory + "/" + controller.getCurrentPage.Name +".bmp"
        url = directory + "/" + right( "0000000" + i, 8) +".bmp" 
        'MsgBox url
        doc.storeToURL( url, args )
    next i

    controller.setCurrentPage( prevCurrentPage ) ' restore current page

end sub
初めて書いたLibreOffice BASIC なので、いろいろおかしいところもあるだろう。
Draw上で、このマクロを実行すると、保存ディレクトリを選択するために、ディレクトリ選択ダイアログが表示される。
ディレクトリを選択すると、そのディレクトリ内へ、各ページが "8桁の数字.bmp" で保存される。

後はshell上で、convertコマンドを使って、アニメーションにする。
convert -delay 50 animation/* animation.gif
上記は、サブディレクトリ"animation/"に、一連の.bmp が保存されていることを期待している。
出来上がったアニメーションは、ファイル名"animation.gif"で保存される。
1コマ0.5秒のアニメーションができる。

これで、コマの多いアニメーションでもイライラしないで作ることができる。
とはいえ、そうそうアニメーションを描くことはないだろう。
おそらく、次に使うときには、何もかも忘れて、イライラしているに違いない。
そして、終わった後で再発見し、「なんという、おっちょこちょい男だろう!」と思うことだろう。

LibreOffice Draw でアニメーション作製
LibreOffice Draw でアニメーション作製#2
LibreOffice Draw でアニメーション作製#3
LibreOffice Draw でアニメーション作製#4
LibreOffice Draw でアニメーション作製#5
2017/10/20 リンクが間違っていた。張り直した。

0 件のコメント:

コメントを投稿