Как получить идентификатор drawable?

Я ищу способ эффективно изменить размер изображения, избегая «OutOfMemory». Для этого я попробовал этот метод: http://developer.android.com/training/displaying-bitmaps/index.html Чтобы использовать эти методы, у меня должен быть идентификатор drawable, поэтому я создаю такой drawable:

Drawable image = Drawable.createFromPath(pathName);

И теперь я не знаю, как получить идентификатор drawable. Метод getIdentifier() подразумевает наличие имени для рисования, но у меня его нет.


person Maxime    schedule 27.09.2013    source источник
comment
зачем тебе ID?   -  person pskink    schedule 27.09.2013
comment
Мне нужен идентификатор для использования метода: BitmapFactory.decodeResource(res, drawableID, options);   -  person Maxime    schedule 27.09.2013
comment
@Maxime: Разве вы не можете напрямую получить идентификатор с помощью R.drawable.yourImageName?   -  person epiphany27    schedule 27.09.2013
comment
вам, вероятно, понадобится decodeFile(String, BitmapFactory.Options)   -  person pskink    schedule 27.09.2013
comment
Drawable создается из файла, загруженного пользователем, поэтому файл не находится в папке drawables. Если я использую decodeFile(), я получаю OutOfMemory, и я не хочу зацикливать уменьшение SampleSize. Это решение слишком плохо для выступлений.   -  person Maxime    schedule 27.09.2013
comment
если вы не хотите использовать SampleSize, то почему вы хотите использовать decodeResource с параметрами?   -  person pskink    schedule 27.09.2013


Ответы (2)


Чтобы использовать эти методы, у меня должен быть идентификатор drawable, поэтому я создаю такой drawable:

Рисуемое изображение = Drawable.createFromPath (pathName);

Во-первых, вам не нужно создавать drawable. Во-вторых, если у вас нет изображения в папке с возможностью рисования, вам не следует использовать

BitmapFactory.decodeResource(res, resId, options)

BitmapFactory также имеет другие методы, такие как

BitmapFactory.decodeFile (String filePath, options); //it takes your image filepath 
(in case your image is in Sdcard) as a string.
or,
BitmapFactory.decodeStream (InputStream, options); // if the image is placed in your asset folder instead of drawables.
person epiphany27    schedule 27.09.2013

Спасибо за ваши ответы. Наконец-то я выбрал этот метод для изменения размера изображений:

private void resizeBitmap(String path) {
        Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        int sampleSize = 0;
        boolean done = false;
        Bitmap source = null;
        while (!done) {
            options.inJustDecodeBounds = false;
            sampleSize++;
            try {
                options.inSampleSize = sampleSize;
                source = BitmapFactory.decodeFile(path, options);
                done = true;
            } catch (OutOfMemoryError e) {

            }
            if (sampleSize > 20) {
                // Exit to avoid infinite loop
                done = true;
            }
        }
        if (source != null) {
            try {
                FileOutputStream out = new FileOutputStream(path);
                source.compress(Bitmap.CompressFormat.JPEG, 90, out);
                out.close();
            } catch (Exception e) {
                Log.e("RESIZE PICTURE", "Unable to resize picture after download : "+e.getMessage());
            }
        }
    }
person Maxime    schedule 27.09.2013