◆PROCESSING 逆引きリファレンス
カテゴリー:スマホ(AndroidMode)
アセットを読み込むには(AndroidMode編)
【概要】
PROCESSINGにAndroidMode を導入する事で、PROCESSINGで開発したプログラムをAndroid端末上で動かす事ができるようになります。
AndroidModeの導入については「PROCESSINGをAndroid端末で動かすには(4.0版)」記事を参照してください。
アプリケーションの動作に必要なデータを格納しておく場所には、ストレージ領域とプログラム領域があります。
アプリケーションの動作に必要なデータが、プログラムの制作段階で準備できるようなものなら、該当データをあらかじめプログラム領域に格納しておき、それをプログラム実行時に読み出して利用するのが一般的です。
同じプログラムの内部領域であるリソースエリアから取得する方法については、「リソースを読み込むには(AndroidMode編)」記事を参照してください。
リソースエリアやアセットエリアは、ストレージ領域とは異なる考え方でアクセスを行います。
リソースエリアとアセットエリアは、AndroidStudioで以下の場所にあります。
【詳細】
PROCESSINGとアセットエリア
プログラムの内部領域にはリソースエリアとアセットエリアがありますが、Androidのプログラムで「より一般的」なのは、リソースエリアでしょう。
Androidには、リソースエリアから文字列や画像データなどを取り出す便利な命令がたくさん用意されています。
ところがPROCESSINGを標準エディタで利用している場合は、リソースエリアは必ずしも使い勝手の良い場所ではありません。そもそも標準エディタの機能だけでは、リソースエリアに予めファイルなどの情報を格納しておくことができないからです。
Javaモード(つまりPC用)のPROCESSINGでは、画像ファイルや任意のファイルは、スケッチフォルダの data フォルダ配下に格納しておくのが通例でした。
例えば、以下はJavaモードのPROCESSINGで画像ファイルを data フォルダから読み込む例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
/** * PROCESSING JavaMode Image Load Sample * @auther MSLABO * @version 1.0 2018/7 */ PImage majyo; void setup(){ size(300,300); majyo = loadImage("witch.png"); } void draw(){ background(255); image(majyo,0,0); } |
<出力例>
(画像URL:illust-AC 様:ほうじ茶さん)
(画像URL:illust-AC 様:ほうじ茶さん)
data フォルダにある witch.png という画像ファイルを loadImage 命令で 読み取っていますが、loadImage 命令にファイル名だけを指定した場合は、指定されたファイルがスケッチフォルダの data フォルダ配下にあるものとして処理されます。
AndroidModeで、この data フォルダに相当するのが Assets フォルダ です。
AndroidModeで動作するプログラム例が下記になります。ほとんどJavaModeの時と一緒ですね(汗)。違うのは size() 命令を使わない事だけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
/** * PROCESSING AndroidMode Image Load Sample * @auther MSLABO * @version 1.0 2018/7 */ PImage majyo; void setup(){ majyo = loadImage("witch.png"); } void draw(){ background(255); image(majyo,0,0); } |
<出力例>
(画像URL:illust-AC 様:ほうじ茶さん)
AndroidModeで loadImage 命令にファイル名だけを指定した場合は、指定されたファイルが Assets フォルダの下にあるものとして、読み取られます。
標準エディタの場合は、スケッチフォルダの data フォルダ配下に画像ファイルをおいておけば、自動的に Assets フォルダにあるものとして処理してくれます。
AndroidStudio で開発している場合は、以下のように Assets フォルダを作成して、その中に画像ファイルを置いておきます。
アセットエリアから任意のファイルを読む
それでは、アセットエリアから任意のファイルを読み取るには、どうしたら良いでしょうか?。
アセットエリアにあるファイルには、Android が提供する AssetManager 経由でアクセスを行います。
.
act : Activityインスタンス
res : Resourcesインスタンス
.
AssetManagerを取得するAssetManager assets = res . getAssets();
assets : AssetManager インスタンス
res : Resourcesインスタンス
AssetManagerを得るには、まずは Activity がもつ getResources () メソッドで Resources インスタンスを取得し、Resources がもつ getAssets() メソッドを利用します。
1 2 |
Activity act = getActivity(); AssetManager assets = act.getResources().getAssets(); |
こんな感じで取得できます。言葉で書くとややこしいですが、コーディングはシンプルですね(笑)。
AssetManager が取得できたら、AssetManager がもつ open() メソッドを利用して、扱いたいファイルを open すればOKです。
.
OPENするInputStream is = assets . open( String fileName );
assets : AssetManager インスタンス
fileName : ファイル名
is : InputStream 記述子
1 2 3 4 5 6 7 8 9 10 |
//AssetManagerを得る Activity act = getActivity(); AssetManager assets = act.getResources().getAssets(); //ファイルをOPENする try { InputStream is = assets.open("witch.png"); } catch (IOException e) { e.printStackTrace(); } |
こんな感じになります。
【関連記事】
サンプルプログラム
画像を読み込む例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
import android.app.Activity; import android.content.res.AssetManager; import android.graphics.Bitmap; import android.graphics.BitmapFactory; /** * PROCESSING AndroidMode Image Load Sample * @auther MSLABO * @version 1.1 2018/7 */ PImage majyo; void setup(){ //AssetManagerを得る Activity act = getActivity(); AssetManager assets = act.getResources().getAssets(); //ファイルをOPENする InputStream is = null; Bitmap bm = null; try { is = assets.open("witch.png"); //リソースエリアから画像データを読み込む BitmapFactory.Options options = new BitmapFactory.Options(); options.inScaled = false; //密度によるサイズ変更をキャンセル bm = BitmapFactory.decodeStream(is, null, options); } catch (IOException e) { e.printStackTrace(); } finally { //後始末 try { if( is != null) is.close(); } catch (IOException e) { e.printStackTrace(); } } //BitmapをPImageに変換する majyo = changeBitmapImage(bm); } //BitMapをPImageに変換する処理 PImage changeBitmapImage(Bitmap bm){ int bitHeight = bm.getHeight(); int bitWidth = bm.getWidth(); //元画像と同じ大きさの空PImageを用意する PImage retImage; retImage = createImage(bitWidth, bitHeight, ARGB); //元画像の画素をすべてPImageに複写する retImage.loadPixels(); bm.getPixels(retImage.pixels, 0, bitWidth, 0, 0, bitWidth, bitHeight); retImage.updatePixels(); return retImage; } void draw(){ background(255); image(majyo,0,0); } |
data フォルダ(AndroidStudioの場合は Assets フォルダ)にある witch.png を自力で読み込んで表示しています。
画像データを読むだけなら、素直に loadImage() すれはOKなので、こんなややこしい手順は必要ありませんが(汗)、Assetsフォルダに置いた 画像以外のファイルの場合は、こんな感じで扱えます。
なお本例では、PROCESSINGは AndroidのBitmapクラスに格納した画像を直接表示できないので、PROCESSING専用の PImage クラスに変換して表示しています。
<出力サンプル>
(画像URL:illust-AC 様:ほうじ茶さん)
本ページで利用しているアイコン画像は、下記サイト様より拝借しております。各画像の著作権は、それぞれのサイト様および作者にあります。