fc2ブログ
ヽ|∵|ゝ(Fantom) の 開発blog? ホーム »画像ファイル読み込み
このページの記事一覧

【Unity】【C#】固定背景画像(2D)を表示する  


 VRM Live Viewer には固定で2D画像を表示できる機能があるが、これの実装を簡単に書いておこう。

 といっても、私もこちらの記事を参考にさせて貰って作ったものだったりする(とりま何でもググる(笑))。

(参考) 背景・前景を固定する

 ただ今の Unity のバージョンだともう少し簡単にできる方法があるので、あくまでも考え方だけ応用した感じ。大まかに説明すると、Quad の代わりに Canvas と RawImage で同じことをすれば、調整などもいらないのでかなり楽にできる。それではやってみよう。


(※) Unity 2020.3.34f1 / Windows11(x64) で確認



■ヒエラルキー上に固定背景専用のカメラと Canvas(RawImage) を用意する

1. まずはスクショのように、空オブジェクト(FixedImage)[※名前等は任意]を作り、その中に Canvas と Camera を新規に追加しよう。Canvas には1つ RawImage を置いておく。



2. 固定背景には余計なものを映したくないので、専用の Layer (2DImage)[※名前は任意] を作って、全て Layer を設定しておく(一番上の FixedImage の Layer を変更すれば「子オブジェクトも変更するか?」のメッセージが出るので適用するのが簡単)。




3. Canvas の Render Mode を「Screen Space - Camera」にし、Render Camera に先程新規追加した Camera をセットしておく。Order in Layer は -1000 など、なるべく一番背後になるような値にしておくと良いだろう。



4. Camera の Clear Flags は Solid Color にし、黒にしておく。Culling Mask に先程作った専用 Layer (2DImage) を指定し、他の Layer が映らないようにしておく。2D 画像専用なら、Projection を Orthographic にしておくと良いだろう。Depth は Main Camera より低い値にしておく。



5. RawImage はストレッチを最大にして、Aspect Ratio Fitter をアタッチしておくと良いだろう。アス比(Aspect Ratio) は 1.77778 (= 16/9 [16:9]) にしておけば良い(もちろん、4:3 の画像なら 1.33333 とかにする)。



6. 最後に元からある Main Camera の Clear Flags を「Depth only」にし、Culling Mask からは「2DImage」の Layer は外しておく(2DImage は映さない=専用カメラで映すため)。



 これで準備は完了だ。固定背景とそれ以外をわかりやすくするために、ヒエラルキーに Capsule など 3Dオブジェクトを置いておくのも良い。次にスクリプトで画像をロードしてみよう。



■スクリプトで画像をロードして、固定背景として映す

 ヒエラルキーの RawImage をスクリプトにアタッチしたら、適当な画像を path に入れて欲しい。フォーマットは .jpg か .png が良いだろう。あとはエディタ上でプレイ(開始)すれば、読み込めるだろう。

●画像を読み込んで、固定背景にするテストスクリプト
using System.IO;
using UnityEngine;
using UnityEngine.UI;

namespace Example
{
public class FixedImageTest : MonoBehaviour
{
public RawImage rawImage;
public string path; //背景にしたい画像のフルパスをインスペクタで入れる

private void Start()
{
if (File.Exists(path))
{
rawImage.texture = LoadTexture2D(path);
}
}

//2D画像をロード
Texture2D LoadTexture2D(string path)
{
var bytes = File.ReadAllBytes(path);
var texture = new Texture2D(2, 2, TextureFormat.ARGB32, mipChain: false);
texture.filterMode = FilterMode.Bilinear;
texture.Compress(false);
texture.LoadImage(bytes);
return texture;
}
}
}


 2D画像のロードは定型処理なので、static にしてライブラリとして使い回せば良いと思う(ここでは簡単にするため、エラーキャッチ等してないので注意)。動画にしたいときは VideoPlayer に動画を読み込んで、RenderTexture に映して表示すれば良い。

 注意点としては Main Camera の Clear Flag を Depth only にしなければならないので、その辺りの切り替えが必要ということかな。アプリでは 2D画像/動画モードに切り替えたときにそうしてる(空[Skybox]が使えなくなるので注意)。画面に貼り付いた感じになるので、距離感や方向感も無くなるね。ADVゲームの固定背景みたいな使い方になるだろう。







(関連記事)
【Unity】【C#】BMP をランタイムで読み込む
【Unity】【C#】画面解像度とアクペクト比(整数)を求める
【Unity】ヒエラルキー(シーン)の Image, RawImage に使われている画像(Texture)を検出するエディタ拡張(ツール)
【Unity】【C#】HDR Color を計算(変換)する
【Unity】【C#】ガンマ(Gamma, sRGB) - リニア(Linear) 値の相互変換
【Unity】【C#】3DText(TextMesh) を半透明より手前に表示する


関連記事
スポンサーサイト



category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityリファレンス  画像ファイル読み込み 
tb: 0   cm: --

【Unity】【C#】TGAをランタイムでロードする  


 BMPLoader に続き、これも試験的(Experimental)に VRM Live Viewer に導入しているのだが、オリジナルソースに少し手を加えた方が使い易いと思うので、ほんのちょっと改造版を載せておこう。

 今回紹介する方法は、オープンソースの TGALoader を使う方法だ。ただ、少し注意点は、「フルカラー・無圧縮」のみ対応という点だ。

 それを踏まえた改造版になる。簡単に説明すれば、「ヘッダ部分から画像データ形式を拾って、フルカラーでなければエラーを出す」というものを付け加えたものだ。あと、github にあったコメントなどの修正もついでに入れてある。


TGALoader.cs (mikezila)
TGA Loader for Unity3D (aaro4130)

(※) Unity 2019.2.21f1 / Windows10(x64) で確認



●TGALoader.cs(フルカラー・無圧縮のみ) [github のほんのちょっと改造版]
// https://gist.github.com/mikezila/10557162
// This was made by aaro4130 on the Unity forums. Thanks boss!
// https://forum.unity.com/threads/tga-loader-for-unity3d.172291/
// It's been optimized and slimmed down for the purpose of loading Quake 3 TGA textures from memory streams.

using System;
using System.IO;
using UnityEngine;

public static class TGALoader
{
public static Texture2D LoadTGA(string fileName)
{
using (var imageFile = File.OpenRead(fileName))
{
return LoadTGA(imageFile);
}
}

public static Texture2D LoadTGA(Stream TGAStream)
{

using (BinaryReader r = new BinaryReader(TGAStream))
{
r.BaseStream.Seek(2, SeekOrigin.Begin);
int type = r.ReadByte(); //(offset 2) 画像形式 (1バイト)

//フルカラー以外は非対応とする(=RLE圧縮は展開コードが必要のため)
if (type != 2)
{
throw new Exception("Only Full-color Uncompressed is supported.");
}

// Skip some header info we don't care about.
// Even if we did care, we have to move the stream seek point to the beginning,
// as the previous method in the workflow left it at the end.
r.BaseStream.Seek(9, SeekOrigin.Current); //offset 3 から +9 → 12

short width = r.ReadInt16(); //(offset 12) 画像の横幅 (2バイト)
short height = r.ReadInt16(); //(offset 14) 画像の縦幅 (2バイト)
int bitDepth = r.ReadByte(); //(offset 16) 色深度 (1バイト)

// Skip a byte of header information we don't care about.
r.BaseStream.Seek(1, SeekOrigin.Current);

Texture2D tex = new Texture2D(width, height);
Color32[] pulledColors = new Color32[width * height];

if (bitDepth == 32) //アルファあり
{
for (int i = 0; i < width * height; i++)
{
byte red = r.ReadByte();
byte green = r.ReadByte();
byte blue = r.ReadByte();
byte alpha = r.ReadByte();

pulledColors [i] = new Color32(blue, green, red, alpha);
}
} else if (bitDepth == 24) //アルファなし
{
for (int i = 0; i < width * height; i++)
{
byte red = r.ReadByte();
byte green = r.ReadByte();
byte blue = r.ReadByte();

/* (github のコメントから)
https://gist.github.com/mikezila/10557162#gistcomment-2995969
pulledColors [i] = new Color32(blue, green, red, 1); //float で 1.0 と間違えた?
1 need to be replaced by 255, in another case, texture become transparent
*/
pulledColors [i] = new Color32(blue, green, red, 255);
}
} else
{
throw new Exception("TGA texture had non 32/24 bit depth.");
}

tex.SetPixels32(pulledColors);
tex.Apply();
return tex;
}
}
}

 ファイルフォーマットに関しては以下を参考にさせて貰った。 このコードではRLE圧縮には対応してない。RLE圧縮に関しては以下の記事にも載っているので、参考にするのも良いだろう。

(参考)
TGA ファイルフォーマット (GAME PROGRAMMING UNIT)
TGA ファイルフォーマット (PROJECT ASURA)

 今回利用するヘッダ部分と画像のデータ形式だけ抜粋させて頂くと以下のような表になる。

ヘッダー (18 byte)
offsetbyte内容
01ヘッダーの後に続く、IDの長さ (ID field length)
11カラーマップの有無 (Color map type)
21データ形式 (Image type)
32カラーマップの位置 (Color map index)
52カラーマップの長さ (Color map length)
71カラーマップエントリーのビット数 (Color map size)
82X (Image origin X)
102Y (Image origin Y)
122幅 (Image width)
142高さ (Image height)
161ピクセルのビット数 (Bit per pixel)
171属性 (Discripter)

(offset 2) データ形式 (1 byte)
値(整数)内容
0イメージなし
1インデックスカラー(256色)
2フルカラー
3白黒
9インデックスカラー。RLE圧縮
10フルカラー。RLE圧縮
11白黒。RLE圧縮

 まぁ、ここでは「フルカラー・無圧縮」に限定してしまっているが、データ形式にあるように「フルカラー/インデックスカラー/白黒」と「圧縮/無圧縮」と「格納方向:縦/横」(offset 17 の属性)を組み合わせるとコードが長くなるのは容易に想像できるだろう。以下に複数の形式で TGA → BMP に変換するサンプルコードはあったので、興味があったら覗いてみるのも良いかも知れない(そしてRLE展開も作ったら公開して欲しい(笑))。

TGALoader.cs (openmetaversefoundation/libopenmetaverse)


 簡単なテストをするには以下ようなのコードで十分だろう。UI に RawImage を適当に置いて、インスペクタにセットし、読み込む画像のパスを設定してプレイすれば良い。画像が表示できたら成功だ。

●簡単な確認コード
using System;
using System.IO;
using UnityEngine;
using UnityEngine.UI;

public class TGALoaderTest : MonoBehaviour
{
public RawImage image; //画像表示用
public string path; //画像パス

// Use this for initialization
private void Start()
{
LoadTGA(path);
}

void LoadTGA(string path)
{
try
{
var tex = TGALoader.LoadTGA(path);
image.texture = tex;
}
catch (Exception e)
{
Debug.LogError(e.Message);
}
}
}

 ちなみにフルカラーのチェックをしないでRLE圧縮形式のTGAを読み込んだ場合は「Unable to read beyond the end of the stream.」というエラーが出る(たぶん圧縮してある場合は、データ長が短くなるので足りなくなり、エラーとなる)。このサンプルコードの場合はフルカラー以外では「Only Full-color Uncompressed is supported.」と出る。必要なら何か処理を入れた方が良いだろう。

 また、私が提供しているプラグインを使えば、Android でも TGA を読み込めた。実際にスマホで全天球ビューワを作ることも可能だ(これが VRM Live Viewer で実装されている)。フリーなので、自由に使って欲しい。

>>AssetStore版






(関連記事)
【Unity】【C#】BMP をランタイムで読み込む
【Unity】【C#】ランタイム時にファイルをドラッグ&ドロップして取得する(Windows のみ)
【Unity】スマホで簡易360度(パノラマ, 全天球)ビューワを作る
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】AssetStore版 FantomPlugin のセットアップ


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityオープンソースライブラリ    画像ファイル読み込み 
tb: 0   cm: --

【Unity】【C#】BMP をランタイムで読み込む  


 実は VRM Live Viewer には既に導入されているのだが、BMP を画像素材(テクスチャ)として利用したいこともあるだろう。実装当時、ググっても英語サイトしか出てこなかったので、需要は少ないのかも知れないが、探すのに苦労しないように備忘録として残しておく。

 今回紹介する方法は、オープンソースの BMPLoader を使う方法だ。

 以前「ランタイム時にファイルをドラッグ&ドロップして取得する」で紹介した「UnityWindowsFileDrag-Drop」の作者の Bunny83 さんの配布ライブラリで、とても簡単に扱えたので、その方法を書いておこう。


(※) Unity 2018.4.8f1 / Windows10(x64) で確認



■BMPLoader を導入する

 導入方法は簡単だ。以下の公開サイトへ行き、コピペで C# ファイルを作って欲しい。ページの一番下の方に「Raw Paste Data」という欄があるので、ここからコピーするのが簡単だろう。

BMPLoader.cs





■簡単なサンプルを作ってみる(基本的なコード)

 ググってみるといくつか出てくるので、以下などを参考にするのも良いだろう。

How to load a BMP file in binary?
How can I use a .bmp file and create a Texture in Unity at runtime?

 実際には BMPLoader.LoadBMP() はいくつかオーバーロードがあるので、利用方法によって使い分けるのも良いかも知れない。ここでは後述する「非同期ロードに対応してみる」に合わせた書き方となっている。定義をみて自分なりに書き換えるのも良いだろう。

●BMPLoadTest.cs(※名前は任意)
using System.IO;
using UnityEngine;
using UnityEngine.UI;
using B83.Image.BMP;

public class BMPLoadTest : MonoBehaviour
{
public RawImage image; //読み込み先(※インスペクタで UI を設定)
public string filePath = "c:/test/image/sample.bmp"; //※ファイルは任意

// Use this for initialization
private void Start()
{
var bytes = File.ReadAllBytes(filePath);
var loader = new BMPLoader();
//loader.ForceAlphaReadWhenPossible = true; // can be uncomment to read alpha
var bmpImage = loader.LoadBMP(bytes);
image.texture = bmpImage.ToTexture2D();
}

private void OnDestroy()
{
if (image.texture != null)
{
Destroy(image.texture);
image.texture = null;
}
}
}

 このサンプルではエラーのチェック等は省略しているので、あくまで全て必要なもの(ファイルとか)が揃っている場合であることを留意しておいて欲しい。

 とりあえず、BMP をロードして表示できたなら成功だ。





■非同期ロードに対応してみる

 とりあえず前述の基本的なコードでも十分なのだが、動作確認が取れたなら、ちょっと手を加えて非同期読み込みすると良いかも知れない。ただし、以下のコードは .NET 4.x 以降である必要がある。

●BMPLoadTest.cs(※名前は任意)
using System.IO;
using System.Threading.Tasks; //※追加
using UnityEngine;
using UnityEngine.UI;
using B83.Image.BMP;

public class BMPLoadTest : MonoBehaviour
{
public RawImage image; //読み込み先(※インスペクタで UI を設定)
public string filePath = "c:/test/image/sample.bmp"; //※ファイルは任意

// Use this for initialization
private async void Start() //※async を追加
{
var bytes = await Task.Run(() => File.ReadAllBytes(filePath)); //※Task で別スレッドで読み込み
var loader = new BMPLoader();
//loader.ForceAlphaReadWhenPossible = true; // can be uncomment to read alpha
var bmpImage = await Task.Run(() => loader.LoadBMP(bytes)); //※Task で別スレッドでロード
image.texture = bmpImage.ToTexture2D();
}

private void OnDestroy()
{
if (image.texture != null)
{
Destroy(image.texture);
image.texture = null;
}
}
}

 ファイルの大きさにもよるが、私が計測したところ、非同期にすれば約1.5倍くらいの速度で読み込める。もし、UniRx を使っているのなら、Task は UniTask にした方が良いだろう。

 ここでは簡単なサンプルなので Start() でやってしまったが、static なメソッドにしてしまえば、使い回しもできて非常に便利だ。その場合にはファイル名やファイル自体の存在チェック、非同期キャンセルのための CancellationToken など入れた方が良いだろう。Task.Run() は2回に分けてあるが、ファイル読み込み/テクスチャとしてロードするのに時間がかかることを考慮して、それぞれにキャンセルチェックをした方が良いと思う(きちんと実装すると結構長くなるため、今回は要点だけにした)。その辺りはご自由に(笑)。

 ちなみに私が提供しているプラグインを使えば、Android でも BMP を読み込めた。実際にスマホで全天球ビューワを作ることも可能だ(これが VRM Live Viewer で実装されている)。

>>AssetStore版






(関連記事)
【Unity】【C#】TGAをランタイムでロードする
【Unity】【C#】ランタイム時にファイルをドラッグ&ドロップして取得する(Windows のみ)
【Unity】スマホで簡易360度(パノラマ, 全天球)ビューワを作る
【Unity】Androidのトーストやダイアログ、通知、音声認識、ハード音量操作など基本的な機能を使えるプラグインを作ってみた
【Unity】AssetStore版 FantomPlugin のセットアップ


関連記事

category: Unity

thread: ゲーム開発

janre: コンピュータ

tag: Unityオープンソースライブラリ  画像ファイル読み込み 
tb: 0   cm: --

【Java】【Android】【PHP】画像を PHP から送信して、Android で受信する  


 以前に、JSON (テキストデータ) を PHP から送信して、Java で受け取ることができたので、今回はそれと同じ考え方で、画像の送受信に置き換えてみる。わざわざ PHP を通してダウンロードしているわけだが、もちろん直接画像のURLにアクセスしてダウンロードしても構わない。PHP でダウンロードする利点はファイル名をデータベースなどに入れて置いて、同じURLで内容を入れ替えられる点だ。この方法なら、画像ファイルを直接アクセスできない場所に置いて、ファイル自体を隠蔽化することもできる。

 クライアント側は Java にしたいので、とりあえず Android にする。画像のデコードはプラットフォームごとに異なるので、その部分だけ入れ替えれば、流用もできるだろう。


 PHP のサンプルコードは超絶簡単なものにする。エラーなどはあまり考えてないので、必要なら適当に付け加えた方が良いだろう。とりあえずファイル名を「image_out.php」としておく。

■画像送信用 PHP(image_out.php)
<?php
$fileName = "img/sample.jpg"; //ファイル名

if (file_exists($fileName)) {
header('Content-type: image/jpeg');
header('Content-Length: '.filesize($fileName)); //あった方が良い
readfile($fileName); //ファイルを読み込んで標準出力に書き出し
exit;
}
?>

 header() で Content-type を出力してるので、「<?php」タグより以前に文字列などを書かないように注意。改行1つでも入ると、PHP では text/html として出力されてしまう。

 このサンプルの場合は、画像ファイル名が固定されているので Content-type が固定されているが、データベースなどからファイル名を読み込んで、画像を切替える場合は、拡張子などで Content-type を切り替えるようにした方が良いだろう。

 ちなみに png と gif の Content-type は、
header('Content-Type: image/png');
header('Content-Type: image/gif');

となる。また、Android では gif はサポート対象外なので、あまり使わない方が良いかも知れない。透過したい場合は png が良いだろう。

 一緒に Content-Length も出力しているが、画像ファイルの場合はあった方が良い。ないと以下の Java コードで Content-Length = -1 (不明)となる。あらかじめファイルサイズを取得して、縮小してダウンロードするときなどには必要になるだろう。ちなみにテキストファイル(text/plain)の場合はコードを書かなくても、Content-Length は勝手に付いてくる(書いても問題ない)。


 あとは、Android 側で画像の受信とデコードをする。以前の JSON 用コードとあまり変わらないので、目新しいものは無いかも知れない。また、Android の場合、マニフェストファイル(AndroidManifest.xml)にインターネット接続用のパーミッションが必要になる。

■インターネット接続用のパーミッション(AndroidManifest.xml)
<uses-permission android:name="android.permission.INTERNET" />

■画像受信用 Java (Android 用)
//テストのメイン... (※例外処理は簡略)
final int CONNECT_TIMEOUT = 15 * 1000; //接続タイムアウト[ms]

String phpUrl = "http://(テストするサーバー)/image_out.php"; //画像送信用 PHPのURL

Bitmap bitmap = null; //受信した画像を入れる

try {
URL url = new URL(phpUrl);
HttpURLConnection con = (HttpURLConnection)url.openConnection();
con.setConnectTimeout(CONNECT_TIMEOUT); //接続タイムアウト
con.setRequestMethod("GET");
con.connect();

bitmap = BitmapFactory.decodeStream(con.getInputStream()); //画像デコード

//確認用
System.out.println("con.getContentType() = " + con.getContentType());
System.out.println("con.getContentLength() = " + con.getContentLength());
System.out.println("con.getResponseCode() = " + con.getResponseCode());
System.out.println("con.getResponseMessage() = " + con.getResponseMessage());

con.disconnect();

} catch (Exception e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}

// ・・・・
// onDraw() などで確認する場合
if (bitmap != null) {
canvas.drawBitmap(bitmap, 0, 0, null);
}

 例外処理はかなり手抜きしてるので、必要に応じて適当に。サーバー接続タイムアウトを取得したいなら、catch 節に SocketTimeoutException を加えれば、捕えることができる。

 URL は HttpURLConnection を使ってるので「http://」前提だが、「https://」なら、HttpsURLConnection を使った方が良いかも知れない(テスト環境がないので、やったことない)。

 また本来なら、サーバーのレスポンスも考慮に入れて、ネットからのダウンロード等は別スレッドでやった方が良いだろう。Android なら ServiceAsyncTask がよく使われているようだ。


(関連記事)
【Java】【PHP】【JSON】JSON を PHP から送信して、Java で受信する
【Java】【PHP】【JSON】JSON を Java から送信して、PHP で受信する
【PHP】【Android】apk ファイルを PHP でダウンロードする


関連記事

category: Android

thread: プログラミング

janre: コンピュータ

tag: PHP  画像ファイル読み込み  通信 
tb: 0   cm: --

【Android】【Java】リソース名で、res/drawable-~ フォルダから、画像を読み込む(Drawable)  


もうひとつ、Android 特有の Drawable オブジェクトでも、「res/raw フォルダから、テキストファイルを読み込む」と同じように、リソース名を引数にした画像読み込み関数を書いておく。

//リソース名で、res/drawable-~ フォルダから、画像を読み込む(Drawable) (Android 用)
public static final Drawable loadDrawableResource(String resName, Context context) throws IOException, FileNotFoundException {
final int id = context.getResources().getIdentifier(resName, "drawable", context.getPackageName());
if (id == 0) { //エラーにはならない
throw new FileNotFoundException("Not Found - " + resName);
}
return context.getResources().getDrawable(id);
}

//メインでは... (※例外処理は省略)
String resName = "sample"; //"res/drawable-nodpi/sample.jpg" 等
Drawable drawable = loadDrawableResource(resName, this); //this は起動した Activity が良い(Context)

例外処理は手抜きしてるので、必要に応じて適当に。

リソースIDで画像読み込みを行うならば、return 文の1行だけでも良い。

Drawable drawable = getContext().getResources().getDrawable(R.drawable.sample);

ただ、ファイル読み込みでは通常、String 型のファイル名等がほとんどなので、int 型のリソースID形式でコードを大量に書いてしまうと汎用性の面では劣る。例えば、リソースIDが割り振られない場所(assets フォルダ等)に移動したときなどは、コードの大幅修正が必要になる。後々の使い回しも考えてコーディングするなら、String 型のリソース名で書いておいた方が、修正も楽だろう。ファイル名やリソース名は設定ファイル等に書いておき、メインコードを interface などを噛ませて置けば、ほとんど修正しなくて良いという利点がある。そういうときに利用すると良い。

ちなみに、「drawable-nodpi」というフォルダを作って、画像を入れておくと、Drawable オブジェクト特有の端末の解像度による自動リサイズがされなくなり、元の画像サイズでロードされる。

実のところ、私はコードの互換性を考えて、ほとんど Drawable オブジェクトは使わない。しかし、画像の拡大・縮小が手軽にできるので、そのためだけに一時的に利用する事がある。そういうときも interface を噛ませておいて、必要に応じて、別仕様の入れ替えができるように作って置くと良いだろう。なるべくプラットフォーム特有仕様は、避ける工夫をしておいた方が、長い目で見れば有益な事が多い。


(関連記事)
【Android】リソース名で、res/drawable-~ フォルダから、画像を読み込む(Bitmap)
【Android】res/raw リソースフォルダからテキストファイルを読み込む
【Android】画像リソースIDをコードで取得する
【Android】アプリ名 app_name タグをコードで取得する
【Android】assets フォルダから画像ファイルを読み込む
【Android】SDカードから画像ファイルを読み込む
【Android】内部ストレージから画像ファイルを読み込む
【Android】【Applet】【Java】テキストファイルの読み込み・保存 まとめ


関連記事

category: Android

thread: プログラミング

janre: コンピュータ

tag: 画像ファイル読み込み 
tb: 0   cm: --


プロフィール

Social

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop