[pukiwiki]
*%%マジンガーZが空を飛べたらなぁ%% Pythonの標準ライブラリにMingが入ってたらなぁ
以前購入したFlashMXも、Vistaでは動かないらしいですし(未確認)
、、、などとグチっててもしょうがないので、Pythonからswfmill.exeにデータを渡して、Flashムービー(swfファイル)を作成してみます。
[[作成してみたサンプルFlashムービー:http://boxheadroom.com/wp/wp-content/uploads/2009/04/test.swf]]
[/pukiwiki]
[pukiwiki]
先にFlashムービー(swfファイル)をプログラム言語から作成したいときのまとめ。
まだまだ、いっぱいありますけど、今回のに直接関係してる分だけ。
Pythonからswfmill.exeにxmlデータを渡して、Flashムービー(swfファイル)を作成してみます。
-[[Ming本家:http://www.libming.org/FrontPage]]
有名なライブラリ。自分でバイナリを作成しようとして何度か挫折。 (よくわかりませぬ)
–[[MingのPythonバインド win32用バイナリ Python2.5用:http://www.asahi-net.or.jp/~rd6t-kjym/tmp/pantograph.html]]
ページ中ほどにmingc-0.0.3a.win32-py2.5.exe
今回は、こちらを使わずにswfmillで遊んでみました。(画像の読込がうまくいかないみたい)
swfmill.exeと連携するやりかたなら、Py3でも動くはずです。ただし、余分なプロセスが必要になりますけれども。
–[[ダウンロード(ソース):http://sourceforge.net/projects/ming]]
–[[Mingまとめ(情報古いです):http://boxheadroom.com/wiki/?Ming]]
–[[PHPとMingで作るFlashサーバー (CodeZine):http://codezine.jp/article/detail/706?p=1]]
”PHPには、Mingは標準で付いてきます”
できれば、標準ライブラリに含めてもらえるとうれしいです。めったに使わない、といえば、それはそうなのですけれども。
-[[DrawSWF:http://drawswf.sourceforge.net/index.html]]
手書きイラストを、描いた順番を再現するアニメーションにしてくれるjavaアプリケーション
[[サンプル:http://boxheadroom.com/diary/2004_01_08_41.html]]
-[[swfmill:http://swfmill.org/]]
swfを解析してxmlに、またはその逆を行ってくれるソフト。
今回のpythonプログラムと同じフォルダにswfmill.exeを解凍しておいてください。というか、無いと動きません。
[/pukiwiki]
とりあえず、線の座標を渡して、順番に線を表示していくプログラム。
DrawSWFで作成したswfファイルを雛形にして、値を書き換えるだけ。
(今回は、10角形の辺、 そして、中心と頂点を結んでみます)
タートルグラフィックなんかと組み合わせると楽しそう。
最初、ElementTreeをつかって元データとなるXMLを作成しようとしたのですが、よくわからなくなったので、まずは原始的でワイルドな方法から。
もっとクールに書く方法はないかしらん?
"linetest.py"
import math
import subprocess
twip=20
W,H=640*twip,480*twip
swf_header="""<?xml version="1.0"?>
<swf version="4" compressed="0">
<Header framerate="20" frames="2">
<size>
<Rectangle left="0" right="%(W)s" top="0" bottom="%(H)s"/>
</size>
<tags>
<SetBackgroundColor>
<color>
<Color red="255" green="255" blue="255"/>
</color>
</SetBackgroundColor>
"""
line_header=""" <DefineShape3 objectID="%(objectid)s">
<bounds>
<Rectangle left="%(bx0)s" right="%(bx1)s" top="%(by0)s" bottom="%(by1)s"/>
</bounds>
<styles>
<StyleList>
<fillStyles/>
<lineStyles>
<LineStyle width="1">
<color>
<Color red="%(pen_r)s" green="%(pen_r)s" blue="%(pen_r)s" alpha="255"/>
</color>
</LineStyle>
</lineStyles>
</StyleList>
</styles>
<shapes>
<Shape>
<edges>
"""
line_point0=""" <ShapeSetup x="%(pen_x0)s" y="%(pen_y0)s" lineStyle="%(pen_thick)s"/>\n"""
line_point1=""" <LineTo x="%(pen_x1)s" y="%(pen_y1)s"/>\n"""
line_footer="""
<ShapeSetup/>
</edges>
</Shape>
</shapes>
</DefineShape3>
<PlaceObject2 replace="0" depth="%(objectid)s" objectID="%(objectid)s">
<transform>
<Transform transX="0" transY="0"/>
</transform>
</PlaceObject2>
<ShowFrame/>
"""
showframe=" <ShowFrame/>\n"
swf_footer=""" <DoAction>
<actions>
<Stop/>
<EndAction/>
</actions>
</DoAction>
<ShowFrame/>
<End/>
</tags>
</Header>
</swf>
"""
txt=""
r=H/3
ox,oy=W//2,H//2
line=[[int(r*math.sin(2*(t/10.)*math.pi))+ox,
int(-r*math.cos(2*(t/10.)*math.pi))+oy] for t in xrange(10+1)]
pen_r,pen_g,pen_b=(0,0,0)
txt+=swf_header%locals()
pen_thick=1
lastx,lasty=line[0]
objectid=0
if True :
for x,y in line[1:]:
bx0,by0=min(lastx-1,x-1),min(lasty-1,y-1)
bx1,by1=max(lastx+1,x+1),max(lasty+1,y+1)
txt+=line_header%locals()
txt+=line_point0%dict(pen_x0=lastx,pen_y0=lasty,pen_thick=1)
txt+=line_point1%dict(pen_x1=x-lastx,pen_y1=y-lasty)
txt+=line_footer%locals()
txt+=showframe*5
lastx=x
lasty=y
objectid+=1
p0=line_point0%dict(pen_x0=ox,pen_y0=oy,pen_thick=1)
txt+="<!-- -->\n"
objectid+=1
if True :
for x,y in line[:-1]:
bx0,by0=min(ox-10,x-10),min(oy-10,y-10)
bx1,by1=max(ox+10,x+10),max(oy+10,y+10)
txt+=line_header%locals()
txt+=p0
txt+=line_point1%dict(pen_x1=x-ox,pen_y1=y-oy)
txt+=line_footer%locals()
txt+=showframe*5
objectid+=1
txt+=swf_footer
fp=open("test.xml","w")
fp.write(txt)
fp.close()
proc = subprocess.Popen(
#'swfmill.exe xml2swf stdin test.swf',
'swfmill.exe xml2swf stdin stdout',
shell=True,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
)
stdout_value = proc.communicate(txt)[0]
fp=open("test.swf","wb")
fp.write(stdout_value)
fp.close()