Android получить растровое изображение или звук из активов - PullRequest
32 голосов
/ 14 декабря 2011

Мне нужно получить растровое изображение и звук из ресурсов.Я пытаюсь сделать так:

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

И вот так:

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

Но я получаю только свободное место, а не изображение.

Как это сделать?

Ответы [ 4 ]

110 голосов
/ 14 декабря 2011
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;
}

путь - это просто имя вашего файла fx bitmap.png. если вы используете подпапку bitmap /, то ее bitmap / bitmap.png

14 голосов
/ 14 декабря 2011

Используйте этот код, чтобы он работал

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

Обновление

При декодировании Bitmap мы чаще встречаемся с исключением переполнения памяти, если размер изображения очень большой.Так что чтение статьи Как эффективно отобразить изображение поможет вам.

7 голосов
/ 19 января 2015

Принятый ответ никогда не закрывает InputStream. Вот служебный метод для получения Bitmap в папке активов:

/**
 * 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;
}
0 голосов
/ 29 июня 2018

Способ получения растрового изображения, которое хранится в папке «Ресурсы».

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

Метод изменения размера растрового изображения.

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