イメージを表示する
画像ファイルを読み込んで、イメージをムービー上に表示するにはSWFBitmap
を塗りつぶし用のオブジェクトとして使用します。SWFBitmap
オブジェクトを生成するにはswfBitmap()
コンストラクタを呼び出します。SWFBitmap
は、指定された画像ファイルから生成されるビットマップを表します。
SWFBitmap swfbitmap ( mixed file [, mixed alphafile] )
このコンストラクタには、file
にイメージそのものを渡します。SWFBitmap
に指定できるイメージ形式は、Jpeg、PNG、GIF、そしてDBLと呼ばれる、Mingに最適化された特殊なPNG形式の画像のいずれかです。省略可能なalphafile
には、イメージの一部分を切り抜くなどの処理に使う、アルファマスク用のファイルの指定ができます。
SWFBitmap
オブジェクトから、読み込んだイメージの幅や高さを取得することもできます。幅を取得するにはgetWidth()
関数を、高さを取得するにはgetHeight()
関数を使います。イメージの配置などのために必要になることがあるでしょう。
float swfbitmap->getwidth ( void ) float swfbitmap->getheight ( void )
これらの関数はSWFBitmap
オブジェクトが表すビットマップイメージの幅と高さをピクセル単位で返します。
読み込んだイメージで作成したSWFBitmap
オブジェクトは、SWFShape
オブジェクトのaddFill()
関数に設定できます。この場合、図形は指定したイメージによって塗りつぶされます。
SWFFill SWFShape->addFill ( SWFBitmap bitmap [, int flags] )
bitmap
に、塗りつぶしに使用するイメージを表すSWFBitmap
オブジェクトを設定します。flags
には、イメージを使ってどのように塗りつぶすかを表す定数を指定します。既定では、イメージを繰り返して図形の内部を塗りつぶすことを表す「SWFFILL_TILED_BITMAP」が設定されています。そのため、イメージのサイズが図形のサイズよりも小さい場合、イメージは繰り返されます。
<?php $image = new SWFBitmap(fopen("test.jpg", "rb")); $shape = new SWFShape(); $fill = $shape->addFill($image); $shape->setRightFill($fill); $shape->drawLineTo($image->getWidth(), 0); $shape->drawLineTo($image->getWidth(), $image->getHeight()); $shape->drawLineTo(0, $image->getHeight()); $shape->drawLineTo(0, 0); $swf = new SWFMovie(); $swf->setDimension($image->getWidth(), $image->getHeight()); $swf->add($shape); $swf->save("test.swf"); print "SWF file has been saved."; ?>
コード05は、ディスク上にある「test.jpg」という名前のイメージファイルを読み込んでSWFBitmap
オブジェクトを生成しています。その後、SWFBitmap
オブジェクトを塗りつぶし属性に設定し、イメージと同じ幅と高さの長方形を表すSWFShape
オブジェクトを定義して表示しています。その結果、長方形の内部はSWFBitmap
が表すイメージで塗りつぶされます。
ただし、この方法で描画する場合は塗りつぶし用のイメージの座標やサイズが問題となります。コード05のように、イメージのサイズとムービーのサイズが一致している場合は問題ありませんが、塗りつぶす図形とイメージの位置やサイズが異なる場合、イメージの一部分だけが表示されることになります。特定の長方形にイメージを伸縮させて表示したい場合、これでは困ります。
<?php $image = new SWFBitmap(fopen("test.jpg", "rb")); $shape = new SWFShape(); $fill = $shape->addFill($image); $shape->setRightFill($fill); $shape->setLine(5, 0, 0, 0); $shape->movePenTo(100, 100); $shape->drawLineTo(200, 100); $shape->drawLineTo(200, 200); $shape->drawLineTo(100, 200); $shape->drawLineTo(100, 100); $swf = new SWFMovie(); $swf->setDimension(400, 300); $swf->setBackground(255, 255, 255); $swf->add($shape); $swf->save("test.swf"); print "SWF file has been saved."; ?>
例えば、コード06はイメージよりも小さい長方形の中身をイメージで塗りつぶした場合です。塗りつぶす図形の座標に関係なく、イメージは原点(0,0)から始まっているため、長方形の左上隅にイメージが切れていることが分かります。これでは、任意の場所にイメージを表示させたい場合に問題になります。
イメージの開始座標の変更
イメージの開始座標を変更するにはaddFill()
関数が返したSWFFill
オブジェクトのmoveTo()
関数を使います。moveTo()
関数は、塗りつぶしオブジェクトの開始座標を指定した座標に変更してくれます。
void swffill->moveto ( int x, int y )
x
にはX座標を、y
にはY座標を指定します。塗りつぶすイメージは、この座標から開始されます。
<?php $image = new SWFBitmap(fopen("test.jpg", "rb")); $shape = new SWFShape(); $fill = $shape->addFill($image); $fill->moveTo(100, 100); $shape->setRightFill($fill); $shape->setLine(5, 0, 0, 0); $shape->movePenTo(100, 100); $shape->drawLineTo(300, 100); $shape->drawLineTo(300, 250); $shape->drawLineTo(100, 250); $shape->drawLineTo(100, 100); $swf = new SWFMovie(); $swf->setDimension(400, 300); $swf->setBackground(255, 255, 255); $swf->add($shape); $swf->save("test.swf"); print "SWF file has been saved."; ?>
コード07は、図形の座標に合わせて、図形に設定するSWFFill
オブジェクトの開始座標を変更したものです。この時点ではイメージを伸縮していないので、イメージの右側や下は切れていますが、図形の左上隅を原点にイメージが塗りつぶされていることを確認できます。
イメージの伸縮
イメージの伸縮はSWFFill
オブジェクトのscaleTo()
関数を使います。scaleTo()
関数は、指定した倍率の値でイメージを伸縮して表示します。
void swffill->scaleto ( int x [, int y] )
x
には水平方向の倍率を、y
には垂直方向の倍率を指定します。y
が省略された場合、垂直方向の倍率にもx
が使われます。ここで指定する値はピクセル単位ではなく、1を基準とした倍率です。例えば、倍率が1のとき、図の中に水平方向で16回繰り返すことができるイメージであれば、 2倍であれば8回、4倍であれば4回、8倍であれば2回繰り返すことができるサイズに伸縮されます。
<?php $image = new SWFBitmap(fopen("test.jpg", "rb")); $shape = new SWFShape(); $fill = $shape->addFill($image); $fill->moveTo(50, 20); $fill->scaleTo(32); $shape->setRightFill($fill); $shape->setLine(5, 0, 0, 0); $shape->movePenTo(50, 20); $shape->drawLineTo(350, 20); $shape->drawLineTo(350, 280); $shape->drawLineTo(50, 280); $shape->drawLineTo(50, 20); $swf = new SWFMovie(); $swf->setDimension(400, 300); $swf->setBackground(255, 255, 255); $swf->add($shape); $swf->save("test.swf"); print "SWF file has been saved."; ?>
moveTo()
関数とscaleTo()
関数を組み合わせることによって、特定の領域にイメージを伸縮して表示することができるようになります。
イメージの回転
さらに、イメージを回転させることも可能です。イメージを回転させるにはrotateTo()
関数を使います。
void swffill->rotateto ( float degrees )
degrees
には、度数単位でイメージを回転させる角度を指定します。
<?php $image = new SWFBitmap(fopen("test.jpg", "rb")); $shape = new SWFShape(); $fill = $shape->addFill($image); $fill->moveTo(0, 150); $fill->rotateTo(50); $shape->setRightFill($fill); $shape->setLine(5, 0, 0, 0); $shape->movePenTo(0, 150); $shape->drawLineTo(200, 0); $shape->drawLineTo(400, 150); $shape->drawLineTo(200, 300); $shape->drawLineTo(0, 150); $swf = new SWFMovie(); $swf->setDimension(400, 300); $swf->setBackground(255, 255, 255); $swf->add($shape); $swf->save("test.swf"); print "SWF file has been saved."; ?>
コード09は、50度だけ回転したイメージをひし形の図形の中に描画するというプログラムです。