web-dev-qa-db-ja.com

アセットフォルダーから画像を読み込む

assetフォルダーから画像をロードして、ImageViewに設定しようとしています。このためにR.id.*を使用する方がはるかに良いことはわかっていますが、前提は画像のIDがわからないことです。基本的に、ファイル名を使用して画像を動的にロードしようとしています。

たとえば、 'cow'を表すdatabase内の要素をランダムに取得します。 ImageViewを介して 'cow'の画像を表示します。これは、databaseのすべての要素にも当てはまります。 (仮定は、すべての要素に同等の画像があることです)

前もって感謝します。

[〜#〜] edit [〜#〜]

質問を忘れた場合、assetフォルダーから画像を読み込むにはどうすればよいですか?

55
kishidp

コード内のファイル名がわかっている場合、これを呼び出しても問題はありません。

ImageView iw= (ImageView)findViewById(R.id.imageView1);  
int resID = getResources().getIdentifier(drawableName, "drawable",  getPackageName());
iw.setImageResource(resID);

ファイル名はdrawableNameと同じ名前になるため、アセットを扱う必要はありません。

32
Erol

これをチェックアウト code 。このチュートリアルでは、アセットフォルダーから画像を読み込む方法を見つけることができます。

//画像を読み込みます

try 
{
    // get input stream
    InputStream ims = getAssets().open("avatar.jpg");
    // load image as Drawable
    Drawable d = Drawable.createFromStream(ims, null);
    // set image to ImageView
    mImage.setImageDrawable(d);
  ims .close();
}
catch(IOException ex) 
{
    return;
}
109
Chirag

はい、どうぞ、

  public Bitmap getBitmapFromAssets(String fileName) {
    AssetManager assetManager = getAssets();

    InputStream istr = assetManager.open(fileName);
    Bitmap bitmap = BitmapFactory.decodeStream(istr);

    return bitmap;
}
43
osayilgan

これらの答えのいくつかは質問に答えるかもしれませんが、私はそれらのどれも好きではなかったので、私はこれを書くことになりました、それはコミュニティを助けます。

アセットからBitmapを取得します。

public Bitmap loadBitmapFromAssets(Context context, String path)
{
    InputStream stream = null;
    try
    {
        stream = context.getAssets().open(path);
        return BitmapFactory.decodeStream(stream);
    }
    catch (Exception ignored) {} finally
    {
        try
        {
            if(stream != null)
            {
                stream.close();
            }
        } catch (Exception ignored) {}
    }
    return null;
}

アセットからDrawableを取得します。

public Drawable loadDrawableFromAssets(Context context, String path)
{
    InputStream stream = null;
    try
    {
        stream = context.getAssets().open(path);
        return Drawable.createFromStream(stream, null);
    }
    catch (Exception ignored) {} finally
    {
        try
        {
            if(stream != null)
            {
                stream.close();
            }
        } catch (Exception ignored) {}
    }
    return null;
}
6
Nicolas Tyler
WebView web = (WebView) findViewById(R.id.webView);
web.loadUrl("file:///Android_asset/pract_recommend_section1_pic2.png");
web.getSettings().setBuiltInZoomControls(true);
2
Evgeny

これは私のユースケースでうまくいきました:

AssetManager assetManager = getAssets();
ImageView imageView = (ImageView) findViewById(R.id.imageView);
try (
        //declaration of inputStream in try-with-resources statement will automatically close inputStream
        // ==> no explicit inputStream.close() in additional block finally {...} necessary
        InputStream inputStream = assetManager.open("products/product001.jpg")
) {
    Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
    imageView.setImageBitmap(bitmap);
} catch (IOException ex) {
    //ignored
}

https://javarevisited.blogspot.com/2014/10/right-way-to-close-inputstream-file-resource-in-Java.html も参照)

1
Yves
public static Bitmap getImageFromAssetsFile(Context mContext, String fileName) {
        Bitmap image = null;
        AssetManager am = mContext.getResources().getAssets();
        try {
            InputStream is = am.open(fileName);
            image = BitmapFactory.decodeStream(is);
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return image;
    }
1
Anil Singhania

Android Developer Documentationによると、bitmapでロードすると、アプリのパフォーマンスが低下する可能性があります。 リンク !したがって、docはGlideライブラリを使用することを提案します。

アセットフォルダから画像をロードしたい場合Glideライブラリヘルプを使用簡単にできます。

https://github.com/bumptech/glide からbuild.gradle(Module:app)に依存関係を追加するだけです

 dependencies {
  implementation 'com.github.bumptech.glide:glide:4.9.0'
  annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0'
}

サンプル例:

// For a simple view:
@Override public void onCreate(Bundle savedInstanceState) {
  ...
  ImageView imageView = (ImageView) findViewById(R.id.my_image_view);

  Glide.with(this).load("file:///Android_asset/img/fruit/cherries.jpg").into(imageView);
}

上記の方法で動作しない場合:thisオブジェクトを以下のコードのviewオブジェクトに置き換えます(Inflateメソッドが適用されている場合のみ以下のコードで)。

 LayoutInflater mInflater =  LayoutInflater.from(mContext);
        view  = mInflater.inflate(R.layout.book,parent,false);
1
Prakash Karkee