« Pluginクラスの作成 | トップページ | イメージレジストリ »

2004.06.10

イメージの扱い方

GUIを伴うアプリケーションを作っていると,どうしても見た目に凝りだすのは仕方のないこと。たいていはアイコンやイメージを作ってGUIに貼り付けることを考えるのではないだろうか。実はアイコンやイメージは,OSから見るとちょっとした重いリソースであり,気にしなければならないことがいくつか出てくる。今回は,Eclipseでイメージを扱うためにはどうしたら良いか,について紹介する。

イメージはgifやjpegなどの形式のバイト配列が実体だが,それはファイルとして保存されていたり,データベースにBLOGとして格納されていたりする。または,どこかのHTTPサーバに配置されているかもしれない。もちろん,それぞれでバイト配列の取得方法に違いが出てくるし,イメージの形式によっても処理内容が違ってくる。

Eclipseでは,イメージリソースの生成を統一化された方法で行うために,ImageDescriptorクラスが提供されている。ImageDescriptorクラスは,ファイル名あるいはURLにより特定される場所から,イメージリソースを生成する方法を知っているクラスである。例えば,あるプラグインのiconsフォルダに存在するsmile.gifファイルからイメージリソースを生成するためのコードは以下のようになる。

  ImageDescriptor descriptor;
  try {
    URL url = MyPlugin.getInstance().getDescriptor().getInstallURL();
    descriptor = ImageDescriptor.createFromURL(new URL(url, "icons/smile.gif"));
  } catch(MalformedURLException e) {
    descriptor = ImageDescriptor.getMissingImageDescriptor();
  }
  Image image = desriptor.createImage();

まず,Pluginクラスのインスタンスを取得し,getDescriptorメソッドでIPluginDescriptorオブジェクトを取得する。そしてIPluginDescriptorオブジェクトのgetInstallURLメソッドを呼び出すことで,プラグインがインストールされている場所を示すURLオブジェクトを得る。これは「Pluginクラスの作成」を参照されたし。

そしてImageDescriptorクラスのcreateFromURLクラスメソッドにイメージの場所を示すURLオブジェクトを渡すことで,ImageDescriptorオブジェクトを取得する。上記では,プラグインがインストールされた場所を示すURLオブジェクトに新たにicons/smile.gifというパスを追加したURLオブジェクトを生成し,createFromURLメソッドに渡すことでImageDescriptorオブジェクトを生成している。その後,createImageメソッドを呼び出すことで,イメージリソースを表すImageオブジェクト(SWTのクラス)を生成する

上記のコードの場合,もしかしたらイメージの場所を示すURLの生成に失敗するかもしれない。その場合,MalformedURLException例外が発生するが,プラグイン的には何らかのイメージが表示されないと都合が悪いこともある。そんなときのために,ImageDescriptorクラスには「イメージの読み込み,ミスったぞ」状態を表すイメージを生成するためのgetMissingImageDescriptorメソッドが用意されている。これを使うと,「missing-image.gif」というイメージリソースがcreateImageメソッドで得られる。

あとはいろんな場所で好きなようにImageオブジェクトを利用すればよい。

さて,イメージリソースはその使用が終わったときには,ちゃんと破棄しなければならない。冒頭で述べたとおり,イメージリソースは重いので,必要最低限のイメージリソースの確保時間にとどめる事がプラグイン開発者に求められる。さもないと,他のプラグイン,しいてはEclipse全体のパフォーマンスに影響を及ぼしかねない。

イメージリソース,つまりImageオブジェクトの破棄は,

  Image image = ...;
  image.dispose();

というようにdisposeメソッドを呼び出すだけである。非常に簡単。いかに必要最低限の確保にとどめ,最適なタイミングでdisposeするか,はプログラマの腕の見せ所だし,楽しく感じる部分である(特にGCに頼り切っているJavaしか知らない開発者は新鮮だろう)。タイミングという点では,JFaceの各種Viewerでは,Viewerが破棄されるときにViewerのdisposeメソッドが呼び出されるので,その中で使用したイメージリソースの破棄を行えばよいし,その他必ずイメージリソースを破棄できるタイミングは存在するはずなので,忘れずにdisposeするように心がけたい。間違っても「Pluginクラスのshutdownメソッド内で一気に破棄すればいいじゃん」なんて横着なことは考えないように。

|

« Pluginクラスの作成 | トップページ | イメージレジストリ »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/12631/743934

この記事へのトラックバック一覧です: イメージの扱い方:

« Pluginクラスの作成 | トップページ | イメージレジストリ »