2017年10月6日金曜日

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

先週のLibreOffice Draw でアニメーション作製のつづき。
手動で.bmpにExportする場合、解像度を指定できる。
しかし、先週作ったマクロでは解像度を指定できず、デフォルト値の37ピクセル/cm(と表示されているが、正確には96dpi)で出力されることになる。
これを変更したい。しかし、ネット上で探すと情報がまとまっておらず、錯綜しており、混乱の極みだった。

まず、storeToURL()メソッドに渡すcom.sun.star.beans.PropertyValue型の.Name = "FilterData"でフィルタ固有の設定の入った配列を渡す。この配列もまたcom.sun.star.beans.PropertyValueで、いわば入れ子構造になっている。

ここまでは、先週の段階で解っていたところだ。
"FilterData"について、真剣に調べるとはまりそうな気がしたので、先週の段階では無視した。また、最初の1歩目は、あまり凝らずにさっさと閉じて、まず形にするのが私のやり方だ。

というわけで、今週の通勤時に、スマホで検索して調べた。
やっと見つけた記事が、OpenOffice-Basic GraphicExportFilter documentation?
まさにこれだと思ったが、コードの断片であり、説明はやはり無い。
下の方のリンクの文書を読んでみたが、"FilterData"の説明は書かれていない。
数日間、通勤時間の朝夕ほとんどをつぎ込んでも、結局"FilterData"について、まとめられた文書はどこにも見当たらなかった(自分の検索の方法が悪いのかもしれないが...)。

しょうが無いので、ソースコードを読んでみることにした。
https://github.com/LibreOfficeで、スマホでもソースコードを参照できる。
現在利用しているLibreOfficeのバージョンは5.1なので、そのGraphicFilterのソースコードを見てみる。
"FilterData"設定で見ているのは、PixelWidthとPixelHeightだけだ。
派生クラスなどでは他の値も使っているかもしれないが、基本的にはこれだけのようだ。
これらの値が、aRenderer.renderToGraphic()に渡されることになる。

サイズの指定がこれだけだとすれば、ドキュメントの縦横幅をピクセル数で指定しているだけと想像できる。
すなわち、dpiやpixel/cmのような物理量と関係する値ではない。そのページを縦横何ピクセルで画像にするかというだけだ。

試しに、先週のコードを以下のように改造して、実行してみた。
sub SavePagesAsBMP
    dim doc  as Object
    dim controller as Object
    dim pages  as Object
    dim prevCurrentPage as Object
    dim args(2) as new com.sun.star.beans.PropertyValue
    dim filterData (2) As New com.sun.star.beans.PropertyValue

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

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

    'MsgBox doc.DBG_properties
    'MsgBox doc.DBG_Methods
    'MsgBox doc.drawPages.DBG_properties
    'MsgBox doc.drawPages.DBG_Methods

    '------------------------------------------------------------
    ' Select directory by Directory Selection dialog
    '------------------------------------------------------------
    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"
    args(1).Name = "FilterData"
        filterData(0).Name =  "PixelWidth"
        filterData(0).Value = 900
        filterData(1).Name = "PixelHeight"
        filterData(1).Value = 800
    args(1).Value = filterData

    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
ちゃんと、900x800で画像が保存できた。

一応動いたとはいえ、もう少しソースコードを追いかけてみたほうがよさそうだ。
また、独自のダイアログを作ることもできそうなので、次はそれを使って値を指定するようにしてみよう。

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

0 件のコメント:

コメントを投稿