SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

PHPとMingで作るFlashサーバー

SWFムービーを作成するWebサーバーを無償ツールだけで構築する

  • X ポスト
  • このエントリーをはてなブックマークに追加

イメージを表示する

 画像ファイルを読み込んで、イメージをムービー上に表示するにはSWFBitmapを塗りつぶし用のオブジェクトとして使用します。SWFBitmapオブジェクトを生成するにはswfBitmap()コンストラクタを呼び出します。SWFBitmapは、指定された画像ファイルから生成されるビットマップを表します。

SWFBitmapコンストラクタ
SWFBitmap swfbitmap ( mixed file [, mixed alphafile] )

 このコンストラクタには、fileにイメージそのものを渡します。SWFBitmapに指定できるイメージ形式は、Jpeg、PNG、GIF、そしてDBLと呼ばれる、Mingに最適化された特殊なPNG形式の画像のいずれかです。省略可能なalphafileには、イメージの一部分を切り抜くなどの処理に使う、アルファマスク用のファイルの指定ができます。

 SWFBitmapオブジェクトから、読み込んだイメージの幅や高さを取得することもできます。幅を取得するにはgetWidth()関数を、高さを取得するにはgetHeight()関数を使います。イメージの配置などのために必要になることがあるでしょう。

getWidth()、getHeight()関数
float swfbitmap->getwidth ( void )

float swfbitmap->getheight ( void )

 これらの関数はSWFBitmapオブジェクトが表すビットマップイメージの幅と高さをピクセル単位で返します。

 読み込んだイメージで作成したSWFBitmapオブジェクトは、SWFShapeオブジェクトのaddFill()関数に設定できます。この場合、図形は指定したイメージによって塗りつぶされます。

addFill()関数
SWFFill SWFShape->addFill ( SWFBitmap bitmap [, int flags] )

 bitmapに、塗りつぶしに使用するイメージを表すSWFBitmapオブジェクトを設定します。flagsには、イメージを使ってどのように塗りつぶすかを表す定数を指定します。既定では、イメージを繰り返して図形の内部を塗りつぶすことを表す「SWFFILL_TILED_BITMAP」が設定されています。そのため、イメージのサイズが図形のサイズよりも小さい場合、イメージは繰り返されます。

コード05
<?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のように、イメージのサイズとムービーのサイズが一致している場合は問題ありませんが、塗りつぶす図形とイメージの位置やサイズが異なる場合、イメージの一部分だけが表示されることになります。特定の長方形にイメージを伸縮させて表示したい場合、これでは困ります。

コード06
<?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()関数は、塗りつぶしオブジェクトの開始座標を指定した座標に変更してくれます。

moveTo()関数
void swffill->moveto ( int x, int y )

 xにはX座標を、yにはY座標を指定します。塗りつぶすイメージは、この座標から開始されます。

コード07
<?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()関数は、指定した倍率の値でイメージを伸縮して表示します。

scaleTo()関数
void swffill->scaleto ( int x [, int y] )

 xには水平方向の倍率を、yには垂直方向の倍率を指定します。yが省略された場合、垂直方向の倍率にもxが使われます。ここで指定する値はピクセル単位ではなく、1を基準とした倍率です。例えば、倍率が1のとき、図の中に水平方向で16回繰り返すことができるイメージであれば、 2倍であれば8回、4倍であれば4回、8倍であれば2回繰り返すことができるサイズに伸縮されます。

コード08
<?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()関数を使います。

rotateTo()関数
void swffill->rotateto ( float degrees )

 degreesには、度数単位でイメージを回転させる角度を指定します。

コード09
<?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度だけ回転したイメージをひし形の図形の中に描画するというプログラムです。

次のページ
Flashを動的生成するサーバー

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
特集記事連載記事一覧

もっと読む

この記事の著者

赤坂 玲音(アカサカ レオン)

平成13年度「全国高校生・専門学校生プログラミングコンテスト 高校生プログラミングの部」にて最優秀賞を受賞。2005 年度~ Microsoft Most Variable Professional Visual Developer - Visual C++。プログラミング入門サイト WisdomSoft の管理人。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/706 2006/11/27 00:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング