<?xml version="1.0" encoding="UTF-8" ?><rss version="2.0"><channel><title>GRAFZ.NET 開発ブログ</title><link>http://grafz.net</link><description>GRAFZ.NET 開発ブログ</description><pubDate>Fri, 17 Feb 2006 09:10:52 +0900</pubDate><item><link>http://grafz.net/c_article_d007.html</link><title>flash利用で手動の画質最適化</title><description><![CDATA[<span class="read">今回はプログラミングから離れて、画像の圧縮と画質について考えてみました。<br />  <br />  jpgファイルは、サイズの大きさと画像の複雑さに比例してファイル容量も大きくなっていきます。ところが、人間が画像を見るときを考えると、必ずしも画像中の複雑な部分が重要ではないんじゃないかとふとひらめきました。たとえば、草むらとか、じゃり道とか、複雑な画像にも関わらず、ファイル容量を食うんじゃないかと。草むらとかじゃり道なんて、少しくらいノイズが出てもいいんじゃないかと思うのは僕だけでしょうか？かと言って、画像全体の画質を下げてしまえば、（例えば）その画像に写っている人の顔にもノイズが入ってきます。<br />  <br />  そこで、画像中を適当に分割してやって、それぞれの領域の画質を手動で設定してやる、ということをしてみます。複数のjpgをテーブルを組むのも手段の一つですが、読み込みの際に、明らかに分割されていることがバレてしまいます。ここではswfとしてひとつのファイルにまとめてしまいます。<br />  <br />  では、サンプル画像の中身を見てみます。<br />  <img src="http://grafz.net/grafz/img/jpgswf1.jpg" alt='説明' width="500" height="375" /><br />  要素としては、空、牛、草むらです。実にシンプルな写真ですね。南ドイツで撮ったものです。空の部分は、画質が下がるにつれてブロックノイズが出現してきます。ゆるやかなグラデーションを表現する為には画質80以上は必要です。幸い、空は単純な絵なため、画質を上げてもファイル容量は重くなりません。次に牛です。この写真で一番見せたい部分なので、画質を高めにしてモスキートノイズを防ぎます。領域が小さいため、画質を高めにしてもファイル全体の容量はそんなに上がりません。そして、草むら。ここは試しに思いっきり画質を下げて見ましょう。少しくらいブロックノイズが出てもよい、と判断しました。<br />  <br />  これら部分部分の画質は、ライブラリの各要素のプロパティで設定できます。パブリッシュしたものが以下です。<br />  <script src="./swfobject.js" type="text/javascript">//</script><script type="text/javascript">swfobject.embedSWF("./img/jpgswf.swf", "myContent", "500", "375", "8.0.0", "./img/expressInstall.swf");</script><div id="myContent">flash player required.<a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></div>比較の為、同じファイルサイズのjpgを以下に貼ってみました。草むらはjpgの方が精細ですが、空はブロックノイズ、牛にはモスキートノイズが出てしまっています。<br /><img src="http://grafz.net/grafz/img/jpgswf0.jpg" alt='' width="500" height="375" /><br /><br />  ご参考になれば嬉しいです。m( __ __ )m</span><br />      <br />]]></description><pubDate>Thu, 26 Jun 2008 22:16:00 +0900</pubDate></item><item><link>http://grafz.net/c_article_d006.html</link><title>虫の動きをスクリプトで記述する</title><description>&lt;span class=&quot;read&quot;&gt;常に進行方向を向きながら回転する物体。その動きをスクリプトで記述してみます。動きをスクリプトで記述することのメリットは、パラメータを変えるだけで物の動きを制御できたり、また、手作業では不可能な動きを作り出せることもあることにあります。&lt;br /&gt;  今回はこれ↓をプログラミングしてみましょう。&lt;br /&gt;  &lt;script src=&quot;./swfobject.js&quot; type=&quot;text/javascript&quot;&gt;//&lt;/script&gt;&lt;script type=&quot;text/javascript&quot;&gt;swfobject.embedSWF(&quot;http://grafz.net/grafz/img/circle.swf&quot;, &quot;myContent20080606&quot;, &quot;150&quot;, &quot;150&quot;, &quot;8.0.0&quot;, &quot;http://grafz.net/grafz/img/expressInstall.swf&quot;);&lt;/script&gt;&lt;div id=&quot;myContent20080606&quot;&gt;flash player required.&lt;a href=&quot;http://www.adobe.com/go/getflashplayer&quot;&gt;&lt;img src=&quot;http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif&quot; alt=&quot;Get Adobe Flash player&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;回転運動をする物体のクラスを作成し、引数で渡すMovieClipのonEnterFrameハンドラをつかまえて動きをつけます。回転運動の中心の座標と、回転確度も指定できるようにします。以下、クラスの記述です。&lt;br /&gt;&lt;div class=&quot;box&quot;&gt;class MyUnit{&lt;br /&gt;&amp;nbsp;&amp;nbsp;var mc:MovieClip;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var nXCenter,nYCenter:Number;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var nAngle:Number;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var nCos,nSin:Number;&lt;br /&gt;&amp;nbsp;&amp;nbsp;function MyUnit(mcIn:MovieClip,nXCenterIn:Number,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nYCenterIn:Number,nAngleIn:Number){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc = mcIn;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.nXCenter = nXCenterIn;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.nYCenter = nYCenterIn;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.nAngle = nAngleIn;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.nCos = Math.cos(this.nAngle);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.nSin = Math.sin(this.nAngle);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var owner:Object = this;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc.onEnterFrame = function(){owner.McOnEnterFrame();}&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;function McOnEnterFrame(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var nX:Number = this.mc._x - this.nXCenter;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var nY:Number = this.mc._y - this.nYCenter;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var nXNew:Number = nX * this.nCos - nY * this.nSin + this.nXCenter;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var nYNew:Number = nX * this.nSin + nY * this.nCos + this.nYCenter;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc._rotation = (180 / Math.PI) * &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Math.atan2(nYNew - this.mc._y,nXNew - this.mc._x);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc._x = nXNew;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc._y = nYNew;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;1行目：MyUnitという名前でクラスを作成します。もちろん何でも構いません。&lt;br /&gt;  2行目：回転運動をさせるMovieClip。そして、&lt;br /&gt;  3行目：（回転の）中心座標、&lt;br /&gt;  4行目：フレームあたりの回転確度。これらをコンストラクタの引数で受け取ります。&lt;br /&gt;  5行目：回転の計算に使用する変数。13-14行目で計算し、22-23行目で使用します。&lt;br /&gt;6-7行目：ここからコンストラクタの記述。&lt;br /&gt;8-11行目：受け取った引数をプロパティに格納します。&lt;br /&gt;13-14行目：回転の計算に使用する変数。22-23行目で使用します。&lt;br /&gt;16行目：MovieClipのスコープからクラスのメソッドにアクセスするための変数。&lt;br /&gt;1７行目：onEnterFrameハンドラをオーバーライドします。19行目からのメソッドを実行します。&lt;br /&gt;19行目：onEnterFrameハンドラで実行されるメソッド。&lt;br /&gt;20-23行目：回転の計算。計算式の詳細は割愛させてください。たしか高校の数学でやった気が。&lt;br /&gt;24-25行目：MovieClipが進行方向を向くようにします。atan2が便利。&lt;br /&gt;26-27行目：MovieClipの新しい位置を代入。&lt;br /&gt;&lt;br /&gt;そして、このクラスのオブジェクトを生成する記述は以下。&lt;br /&gt;      &lt;div class=&quot;box&quot;&gt;var oUnit:Object = new MyUnit(this.mcUnit,Stage.width * 0.5,Stage.height * 0.5,0.1);&lt;/div&gt;mcUnitというのは、回転させる対象のMovieClip。回転の中心は、ステージの中心を指定します。回転確度の単位はここではラジアン。度数にしたい場合は、(度数)*(Math.PI / 180)を引数で渡せばOK。&lt;br /&gt;      &lt;br /&gt;    動きを決定する要素にランダムな数値を加えてやることで、生命感のある飽きさせない動きなども表現できるかもしれません。そのようなことは、スクリプト制御だからこそ可能な表現ですね。&lt;br /&gt;      &lt;br /&gt;      ご参考になれば嬉しいです。m( __ __ )m&lt;/span&gt;&lt;br /&gt;</description><pubDate>Fri, 6 Jun 2008 14:25:00 +0900</pubDate></item><item><link>http://grafz.net/c_article_d005.html</link><title>MovieClipLoaderで画像をロードする</title><description>&lt;span class=&quot;read&quot;&gt;ダウンロードしたswfファイルの中に、さらに画像などを読み込む方法といえば、loadMovieがまず思いつきます。このメソッドはURLを指定してやるだけでよくて、記述が簡単なんですが、難がひとつあります。それは、ロードが完了したタイミングをつかまえられない、ということ。つまり、読み込みが完了した直後にその画像を非表示にする、などということができません。&lt;br /&gt;  そういったニーズを満たしてくれるのが、MovieClipLoader。このクラスのオブジェクトに、リスナーオブジェクトを追加してやることで、画像読み込みに関連するいろいろなイベント、例えばエラー処理や読み込み完了など、を処理することができます。今日はもっとも基本的なパターンとして、「画像読み込みが完了するまではloading表示、完了したらloadingを消して、画像を表示」という挙動のクラスを設計してみます。&lt;br /&gt;  &lt;br /&gt;  ざっくりとした仕様としては、StartLoadメソッドで画像の読み込みを開始して、ロード完了と同時に画像を非表示化。表示・非表示はShowメソッド、Hideメソッドで行う、という感じです。読み込みが完了する前のタイミングでShowが呼ばれたとしても、読み込み完了と同時に表示されるように時間差をクッションしてやる、というのがコツです。以下ソースコードです。&lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;&lt;div class=&quot;box&quot;&gt;class MyPictureUnit{&lt;br /&gt;&amp;nbsp;&amp;nbsp;var mc:MovieClip;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var oLoader:MovieClipLoader;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var oListener:Object;&lt;br /&gt;&amp;nbsp;&amp;nbsp;var fVisible,fLoaded:Boolean;&lt;br /&gt;&amp;nbsp;&amp;nbsp;function MyPictureUnit(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc = _root.createEmptyMovieClip(&quot;mcSample&quot;,_root.getNextHighestDepth());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc.createEmptyMovieClip(&amp;quot;mcPicture&amp;quot;,_root.getNextHighestDepth());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc.createTextField(&quot;tfLoading&quot;,_root.getNextHighestDepth(),0,0,0,0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc.tfLoading.autoSize = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc.tfLoading.text = &quot;loading...&quot;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.oListener = new Object();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var owner:Object = this;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.oListener.onLoadComplete = function(){owner.OnLoadComplete();}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.oLoader = new MovieClipLoader();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.oLoader.addListener(this.oListener);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.fLoaded = this.fVisible = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.StartLoad();&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;function StartLoad(strFilename:String){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.oLoader.loadClip(strFilename,this.mc.mcPicture);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;function OnLoadComplete(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.fLoaded = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc.tfLoading._visible = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc.mcPicture._visible = this.fVisible;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;function Show(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.fVisible = true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc.mcPicture._visible = this.fLoaded;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;function Hide(){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.fVisible = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;this.mc.mcPicture._visible = false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;  &lt;/span&gt; &lt;span class=&quot;read&quot;&gt;1行目：MyPictureUnitという名前でクラスを作成します。もちろん何でも構いません。&lt;br /&gt;  2行目：このmcの上に、loading表示のTextField、画像を貼り付けるmcを載せます。&lt;br /&gt;  3-4行目：MovieClipLoaderオブジェクトと、イベント処理用のリスナーオブジェクト。&lt;br /&gt;  5行目：ロードが完了したかどうか、表示が要求されたかどうかを格納するフラグ。&lt;br /&gt;  6行目：ここからコンストラクタです。&lt;br /&gt;  7行目：2行目のmcを作成します。ここではルート直下を指定していますが、任意でも可です。&lt;br /&gt;  8行目：さらにその上に画像を貼り付けるためのmcPictureというMovieClipを作成します。&lt;br /&gt;  10行目：tfLoadingという名前で、loading表示のためのTextFieldを作成します。大きさは(0,0)ですが、&lt;br /&gt;  11行目：autoSizeにして文字の大きさにTextFieldが変形されるようにしてあります。&lt;br /&gt;  12行目：tfLoadingに文字列を設定。please wait...でもよいです。もちろん。 &lt;br /&gt;  14行目：イベント処理のためのリスナーオブジェクトを作成します。&lt;br /&gt;  15行目：oListenerのスコープから外にアクセスするための変数。後で使います。&lt;br /&gt;  16行目：画像の読み込みが完了したらOnLoadCompleteというメソッドが呼ばれるようにします。詳細は27行目で。&lt;br /&gt;  17行目：MovieClipLoaderオブジェクトを作成し、&lt;br /&gt;  18行目：14行目で作成したリスナーオブジェクトを登録します。&lt;br /&gt;  20行目：5行目のフラグをfalseで初期化します。&lt;br /&gt;  22行目：StartLoadメソッドで画像の読み込みを開始します。&lt;br /&gt;  24行目：StartLoadメソッドは何かというと、&lt;br /&gt;  25行目：17行目で作成したMovieClipLoaderオブジェクトに画像のファイル名と読み込み先のMovieClip(2行目で作成済み)を指定して画像の読み込みを開始します。&lt;br /&gt;  27-31行目：画像の読み込みが完了したときに呼ばれます。フラグfLoadedをtrueにし、loading表示を非表示にし、このタイミングで既にShowメソッドが呼ばれていた場合のみ読み込んだ画像を表示させます。&lt;br /&gt;  32-35行目：画像の表示させるためのメソッドで、fVisibleは30行目で使用。画像がまだ読み込まれている場合のみ、画像を表示させます。&lt;br /&gt;  36-39行目：Showメソッドの逆。&lt;br /&gt;  &lt;br /&gt;  という具合です。このクラスの使用方法は、例えば以下のようになります。rootでの記述です。  &lt;br /&gt;  &lt;br /&gt;  &lt;br /&gt;      &lt;div class=&quot;box&quot;&gt;var oPicture:Object = new MyPicture();&lt;br /&gt;        this.oPicture.StartLoad(&amp;quot;sample.jpg&amp;quot;);&lt;br /&gt;      this.oPicture.Show();&lt;/div&gt;      &lt;/span&gt;      &lt;span class=&quot;read&quot;&gt;1行目：ページ上部で作成したMyPictureUnitクラスのオブジェクトを作成し、&lt;br /&gt;2行目：ファイル名を指定して画像の読み込みを開始します。&lt;br /&gt;3行目：画像を表示させます。読み込みが完了していない場合は、完了と同時に表示し、既に完了している場合は即時に表示されます。このShowメソッドを呼び出すタイミングは任意で、例えばボタンなどに割り当ててもOKです。&lt;br /&gt;&lt;br /&gt;ご参考になれば嬉しいです。m( __ __ )m&lt;br /&gt;&lt;/span&gt;</description><pubDate>Sat, 24 May 2008 08:27:00 +0900</pubDate></item></channel></rss>