記事一覧

[Sアプリ→iアプリ移植]画像ファイルの読み込み

最近、いままで作ったSアプリをiアプリに移植する作業をしています。同じJava言語ではあるので、そんなに違いはないのですが、主に以下の点が各キャリア独自のAPIになっています。
・画面描画
・音楽再生
・キー入力
・その他携帯特有の機能(カメラ機能、振動機能、・・・)

そのため、上記のラッパーを作っておき、直接描画APIなどをアプリケーションから呼び出さないようにすれば、移植時に最小限の作業で済ませることができます。

今回は手始めとして、画像ファイルを画面描画する処理について比較してみたいと思います。

★/resディレクトリ直下に置いてある「cursor.gif」ファイルから、Imageオブジェクトを作成する場合を比較してみると以下のようになります。

■Sアプリの場合
Image image = Image.createImage("/cursor.gif");

■iアプリの場合
MediaImage mi = MediaManager.getImage("resource:///cursor.gif");
try{
mi.use();
}catch(Exception e){
}
Image image = mi.getImage();

iアプリのほうがなんだか面倒ですね!
mi.use()をしなくても、何もエラーにならずに画像が描画されもしないので、これをやらなければいけないことに気づくのに少し時間がかかりました・・・。


★次に、Imageオブジェクトを画面に描画する処理を比べてみます。

■Sアプリの場合
paint(Graphics g){
g.drawImage(image, x, y, Graphics.TOP|Graphics.LEFT);

■iアプリの場合
paint(Graphics g){
g.drawImage(image, x, y);

x, y で描画の基点を指定しますが、Sアプリのほうは、その基点の左上に描画するのか、右下に描画するのかなどを第三引数で指定する必要があります。iアプリのほうは右下固定だったかな?


★画像を回転して表示する場合は次のようになります。
■Sアプリの場合
paint(Graphics g){
g.drawImage(Image.createImage(image, 0, 0, image.getWidth(), image.getHeight(), Sprite.TRANS_ROT180)
, x, y, Graphics.TOP|Graphics.LEFT);

Imageオブジェクト生成時に角度を指定する感じです。
上記の例だと一度Imageオブジェクトを作り直しているので効率悪いですね・・・。かといって最初に全パターンの角度でImageオブジェクトをつくっておくのもメモリが・・・。

選択肢は以下。
* javax.microedition.lcdui.game.Sprite.Sprite.TRANS_NONE - 指定されたイメージ領域を変形せずにコピーします。
* javax.microedition.lcdui.game.Sprite.Sprite.TRANS_ROT90 - 指定されたイメージ領域を時計回りに90度回転してコピーします。
* javax.microedition.lcdui.game.Sprite.Sprite.TRANS_ROT180 - 指定されたイメージ領域を時計回りに180度回転してコピーします。
* javax.microedition.lcdui.game.Sprite.Sprite.TRANS_ROT270 - 指定されたイメージ領域を時計回りに270度回転してコピーします。
* javax.microedition.lcdui.game.Sprite.Sprite.TRANS_MIRROR - 指定されたイメージ領域を水平中央辺りで反転してコピーします。
* javax.microedition.lcdui.game.Sprite.Sprite.TRANS_MIRROR_ROT90 - 指定されたイメージ領域を水平中央辺りで反転した後、時計回りに90度回転してコピーします。
* javax.microedition.lcdui.game.Sprite.Sprite.TRANS_MIRROR_ROT180 - 指定されたイメージ領域を水平中央辺りで反転した後、時計回りに180度回転してコピーします。
* javax.microedition.lcdui.game.Sprite.Sprite.TRANS_MIRROR_ROT270 - 指定されたイメージ領域を水平中央辺りで反転した後、時計回りに270度回転してコピーします。

■iアプリの場合
paint(Graphics g){
g.setFlipMode(Graphics.FLIP_ROTATE_RIGHT);
g.drawImage(image, x, y);

Graphics.drawImageに対して角度を指定する感じです。

選択肢は以下。
* Graphics.FLIP_NONE - 指定されたイメージ領域を変形せずにコピーします。
* Graphics.FLIP_ROTATE_RIGHT - 指定されたイメージ領域を時計回りに90度回転してコピーします。
* Graphics.FLIP_ROTATE - 指定されたイメージ領域を時計回りに180度回転してコピーします。
* Graphics.FLIP_ROTATE_LEFT - 指定されたイメージ領域を時計回りに270度回転してコピーします。
* Graphics.FLIP_VERTICAL - 指定されたイメージ領域を水平中央辺りで反転してコピーします。
* Graphics.FLIP_HORIZONTAL - 指定されたイメージ領域を水平中央辺りで反転した後、時計回りに90度回転してコピーします。
* Graphics.FLIP_ROTATE_RIGHT_HORIZONTAL - 指定されたイメージ領域を水平中央辺りで反転した後、時計回りに180度回転してコピーします。
* Graphics.FLIP_ROTATE_RIGHT_VERTICAL - 指定されたイメージ領域を水平中央辺りで反転した後、時計回りに270度回転してコピーします。

ページ移動

  • 前のページ
  • 次のページ