Что такое источник растрового изображения в параметрах createBitmap()?

Я следую это ТАК сообщение о том, как обрезать изображение с помощью растрового изображения.

Как подтверждается в документации Android, существует метод createBitmap(), который имеет следующие параметры:

createBitmap(Bitmap source, int x, int y, int width, int height)

Но я не понимаю, каким должен быть этот источник Bitmap. Я считаю, что это должно относиться к изображению, которое я хочу использовать для своего объекта Bitmap. Изображение, которое я хочу использовать, хранится в виде рисуемой радуги, поэтому я попробовал следующее:

    Bitmap cropedBitmap = Bitmap.createBitmap(R.id.rainbow, 0, 0, 300, 300);

В этом случае Android Studio сообщает: «Не удается разрешить символ «радуга»

Я также пробовал:

      Bitmap cropedBitmap = Bitmap.createBitmap(R.drawable.rainbow, 0, 0, 300, 300);

и Android Studio сообщает: «Не удается разрешить метод createBitmap (int, int, int, int, int)

Из документации я вижу, что первым параметром является растровое изображение. Разве это не использование растрового изображения для создания растрового изображения? Также я не вижу никаких конструкторов для класса Bitmap на его странице документации.

Любые предложения о том, что мне не хватает или что попробовать дальше?


person Timothy Steele    schedule 31.05.2015    source источник


Ответы (2)


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

person Ilja KO    schedule 31.05.2015

R.drawable.rainbow — это целочисленное значение, а не растровое изображение, поскольку это просто сгенерированный идентификатор ваших ресурсов.

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

Редактировать: добавить параметры и способ вызова drawable

BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 4;
Drawable drawable = getResources().getDrawable(R.drawable.rainbow);
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
Bitmap cropedBitmap = Bitmap.createBitmap(bitmap, options), 0, 0, 300, 300);
person Youngjae    schedule 31.05.2015
comment
Пожалуйста, не делайте этого. Это создает два растровых изображения (одно во время декодирования, а затем масштабированную версию), причем первое немедленно отправляется на сборку мусора. Однако, учитывая нехватку памяти для растровых изображений, очень важно не создавать временные растровые изображения. - person dhke; 31.05.2015
comment
@dhke // привет. спасибо за указание. тогда как насчет ((BitmapDrawable)drawable).getBitmap();? будет так же? - person Youngjae; 31.05.2015
comment
@dhke Есть ли хорошая альтернатива? Если да, то хотели бы опубликовать ответ? - person Timothy Steele; 31.05.2015
comment
Слишком много накладных расходов с опциями решают такие проблемы - person Ilja KO; 31.05.2015
comment
@TimothySteele Я бы посоветовал всегда использовать библиотеку загрузчика изображений. Код для этого становится довольно длинным и запутанным, как только вы начинаете рассматривать imSampleSize и тому подобное. - person dhke; 31.05.2015
comment
@Youngjae Когда у вас есть возможность рисования, растровое изображение уже загружено, поэтому никаких (дополнительных) проблем с памятью из-за доступа к внутреннему растровому изображению нет. - person dhke; 31.05.2015
comment
@dhke Не могли бы вы опубликовать свой комментарий в качестве ответа? Хотя вы на самом деле не ответили на мой вопрос, вы ответили на вопрос, который я должен был задать. Использование библиотеки загрузчика изображений было лучшим вариантом для решения моей проблемы. Я использовал библиотеку Пикассо. - person Timothy Steele; 03.09.2015