44

I need to get Bitmap and sound from assets. I try to do like this:

BitmapFactory.decodeFile("file:///android_asset/Files/Numbers/l1.png");

And like this:

getBitmapFromAsset("Files/Numbers/l1.png");
    private Bitmap getBitmapFromAsset(String strName) {
        AssetManager assetManager = getAssets();
        InputStream istr = null;
        try {
            istr = assetManager.open(strName);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Bitmap bitmap = BitmapFactory.decodeStream(istr);
        return bitmap;
    }

But I get just free space, not image.

How to do this?

DAIRAV
  • 723
  • 1
  • 9
  • 31
Val
  • 4,225
  • 8
  • 36
  • 55

6 Answers6

133
public static Bitmap getBitmapFromAsset(Context context, String filePath) {
    AssetManager assetManager = context.getAssets();

    InputStream istr;
    Bitmap bitmap = null;
    try {
        istr = assetManager.open(filePath);
        bitmap = BitmapFactory.decodeStream(istr);
    } catch (IOException e) {
        // handle exception
    }

    return bitmap;
}

the path is simply your file name fx bitmap.png. if you use subfolder bitmap/ then its bitmap/bitmap.png

Czechnology
  • 14,832
  • 10
  • 62
  • 88
Warpzit
  • 27,966
  • 19
  • 103
  • 155
18

Use this code its working

try {
    InputStream bitmap=getAssets().open("icon.png");
    Bitmap bit=BitmapFactory.decodeStream(bitmap);
    img.setImageBitmap(bit);
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}

Update

While decoding Bitmap we more often meet with memory overflow exception if Image size is very big. So reading article How to display Image efficiently will help you.

Jared Rummler
  • 37,824
  • 19
  • 133
  • 148
Tofeeq Ahmad
  • 11,935
  • 4
  • 61
  • 87
11

Short Kotlin version:

assets
   .open(name)
   .use(BitmapFactory::decodeStream)
artem
  • 16,382
  • 34
  • 113
  • 189
9

The accepted answer never closes the InputStream. Here is a utility method for getting a Bitmap in the assets folder:

/**
 * Retrieve a bitmap from assets.
 * 
 * @param mgr
 *            The {@link AssetManager} obtained via {@link Context#getAssets()}
 * @param path
 *            The path to the asset.
 * @return The {@link Bitmap} or {@code null} if we failed to decode the file.
 */
public static Bitmap getBitmapFromAsset(AssetManager mgr, String path) {
    InputStream is = null;
    Bitmap bitmap = null;
    try {
        is = mgr.open(path);
        bitmap = BitmapFactory.decodeStream(is);
    } catch (final IOException e) {
        bitmap = null;
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException ignored) {
            }
        }
    }
    return bitmap;
}
Jared Rummler
  • 37,824
  • 19
  • 133
  • 148
  • This should be the accepted answer ! You don't want not to close a stream because the kind of exception you might get later would be a native exception, meaning you will not be able to catch it :( – Amit Farkash Dec 13 '16 at 15:42
3

Kotlin way, with auto close of the input stream. You have to handle exceptions on your own.

private fun getBitmapFromAsset(context: Context, path: String): Bitmap =
        context.assets.open(path).use { BitmapFactory.decodeStream(it) }
tomrozb
  • 25,773
  • 31
  • 101
  • 122
0

Method to get bitmap of image which is stored in Assets folder.

       public static Bitmap getBitmapFromAssets(Context context, String fileName, int width, int height) {
        AssetManager assetManager = context.getAssets();

        InputStream istr;
        Bitmap bitmap = null;
        try {
            final BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;

            istr = assetManager.open(fileName);

            // Calculate inSampleSize
            options.inSampleSize = calculateInSampleSize(options, width, height);

            // Decode bitmap with inSampleSize set
            options.inJustDecodeBounds = false;
            return BitmapFactory.decodeStream(istr, null, options);
        } catch (IOException e) {
            Log.e("hello", "Exception: " + e.getMessage());
        }

        return null;
    }

Method to resize the bitmap.

 private static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {

            final int halfHeight = height / 2;
            final int halfWidth = width / 2;

            // Calculate the largest inSampleSize value that is a power of 2 and keeps both
            // height and width larger than the requested height and width.
            while ((halfHeight / inSampleSize) >= reqHeight
                    && (halfWidth / inSampleSize) >= reqWidth) {
                inSampleSize *= 2;
            }
        }

        return inSampleSize;
    }
Anil Singhania
  • 785
  • 10
  • 9