Загрузить изображение из папки ресурсов

Я пытаюсь загрузить изображение из asset папку, а затем установите его в ImageView, Я знаю, что гораздо лучше, если я использую R.id.* для этого, но предпосылка в том, что я не знаю идентификатор изображения. По сути, я пытаюсь динамически загрузить изображение через его имя файла.

Например, я случайно выбираю элемент в database Представляя, скажем, "корову", теперь мое приложение будет отображать изображение "коровы" через ImageView, Это также верно для всех элементов в database, (Предполагается, что для каждого элемента существует эквивалентное изображение)

заранее спасибо.

РЕДАКТИРОВАТЬ

забыл вопрос, как мне загрузить изображение с asset папка?

9 ответов

Решение

Если вы знаете имя файла в коде, вызов этого не будет проблемой:

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

Ваше имя файла будет таким же, как и drawableName, поэтому вам не придется иметь дело с активами.

Оформить заказ этот код. В этом уроке вы можете найти, как загрузить изображение из папки ресурсов.

// загрузить изображение

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;
}

Вот ты где,

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

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

    return bitmap;
}

Некоторые из этих ответов могут ответить на вопрос, но мне никогда не нравился ни один из них, поэтому я написал это, это моя помощь сообществу.

Получить 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;
}

Согласно документации разработчика Android, загрузка с помощью растрового изображения может ухудшить производительность приложения. Вот ссылка! Так что док предлагает использовать библиотеку Glide.

Если вы хотите загрузить изображение из папки ресурсов, то с помощью библиотеки Glide вам будет легче.

просто добавьте зависимости в build.gradle (Модуль: приложение) с https://github.com/bumptech/glide

 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);
}

В случае, если вышеописанный метод не работает: замените этот объект на представленный ниже код вида объекта (только если у вас есть метод Inflate, примененный как показано ниже в вашем коде).

 LayoutInflater mInflater =  LayoutInflater.from(mContext);
        view  = mInflater.inflate(R.layout.book,parent,false);
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;
    }

Это сработало в моем случае использования:

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)

WebView web = (WebView) findViewById(R.id.webView);
web.loadUrl("file:///android_asset/pract_recommend_section1_pic2.png");
web.getSettings().setBuiltInZoomControls(true);

Вы просто можете использовать эту функцию расширения Kotlin, где String ссылается на fileName

      fun String.assetsToBitmap(context: Context): Bitmap? {
    return try {
        val assetManager = context.assets
        val inputStream = assetManager.open(this)
        val bitmap = BitmapFactory.decodeStream(inputStream)
        inputStream.close()
        bitmap
    } catch (e: Exception) {
        e.printStackTrace()
        null
    }
}

Пример использования

      val myBitmap = "sample.png".assetsToBitmap(context)
Другие вопросы по тегам