Страница 1 из 1

весь этот bitmap

Добавлено: 15 апр 2016, 10:34
Lisa
Допустим вы гангстер и вам нужно сделать приложение которое разместит на активити, в программно созданные imageview - двадцать, а то и более скриншотов из всех ваших видео с убийствами.
Вы закуриваете сигару, но не знаете как это сделать лучше.
В интернет вы находите код:

Код: Выделить всё

   btm = null;
	   		    MediaMetadataRetriever retriever = new MediaMetadataRetriever();
	   		    try {
	   		        retriever.setDataSource(videoSource);
	   		     btm = retriever.getFrameAtTime(500);
	   		    } catch (IllegalArgumentException ex) {
	   		    } catch (RuntimeException ex) {
	   		    } finally {
	   		        try {         retriever.release();    } catch (RuntimeException ex) {
	   		 
	   		        }}
	   		    
	   		    
	   		    if (btm!=null){imageView.setImageBitmap(btm); 
И используете его в цикле for
Но вот незадачка, ваша любимая дочка - Лиза, жалуется что все работает очень медленно, а главное - приложение вылетает с ошибкой при большом количестве скриншотиков.

Вас бы конечно все устроило. Но девочкам нужно чтобы все было идеально.
И пока вы нанимаете человека, который поможет вам с кодом, Лиза сама отправляется на форум и задает вопрос..


Я слышала что bitmap очень прожорливые,
и что после каждого "мокрого" дела, нужно заметать следы.

Знающие люди, подскажите пожалуйста, как лучше освобождать память после работы с bitmap кодированием ?
Достаточно просто сделать так: bitmap = null
или так bitmap .recycle();

Или может есть способ почистить cache memory, после отработки цикла с кодированием.

Re: весь этот bitmap

Добавлено: 15 апр 2016, 12:39
klblk
Можно ужать битмепы, а при клике на ужатый показывать полную версию (хранить ее не нужно):
[syntax=java5] int width = bitmap.getWidth();
int height = bitmap.getHeight();
int max = Math.max(width, height);
if (max > 512) {
float scale = 512f / max;
int w = Math.round(scale * width);
int h = Math.round(scale * height);
bitmap = Bitmap.createScaledBitmap(bitmap, w, h, true);
}[/syntax]

лучше сделать так:
[syntax=java5]bitmap .recycle();
bitmap = null;[/syntax]
чтоб наверняка.
И еще этот цикл для получения bitmap'ов нужно запихнуть в отдельный поток, до того как они загрузятся показывать прогрессбарчики, решит проблему с долгим запуском.

Re: весь этот bitmap

Добавлено: 15 апр 2016, 12:44
Foenix
да хоть сто на одном экране. Используй любую нормальную библиотеку на выбор, например, Picasso.

Re: весь этот bitmap

Добавлено: 15 апр 2016, 13:54
Lisa
Спасибо) вроде работает нормально

Re: весь этот bitmap

Добавлено: 15 апр 2016, 16:21
Mikhail_dev
Еще как вариант использовать формат RGB_565 , вместо дефолтного ARGB_8888 . Первый тратит два байта на пиксел, второй 4. Но первый не использует альфа канал для сохранения. В одном из уроков по графике была подобного рода информация, на этом сайте.

Re: весь этот bitmap

Добавлено: 16 апр 2016, 16:10
Lisa
Я почитала stackoverflow и пришла к выводу, что метод createScaledBitmap сам применяет формат RGB_565 к изображениям без альфы. Но спасибо, буду иметь ввиду.

If your original bitmap contains alpha, ARGB_8888 will be returned. Otherwise RGB_565. Don't use createScaledBitmap if you don't want ARGB_8888