весь этот bitmap

Ответить
Аватара пользователя
Lisa
Сообщения: 22
Зарегистрирован: 16 ноя 2015, 14:29

весь этот bitmap

Сообщение Lisa » 15 апр 2016, 10:34

Допустим вы гангстер и вам нужно сделать приложение которое разместит на активити, в программно созданные 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, после отработки цикла с кодированием.

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

Re: весь этот bitmap

Сообщение klblk » 15 апр 2016, 12:39

Можно ужать битмепы, а при клике на ужатый показывать полную версию (хранить ее не нужно):
[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'ов нужно запихнуть в отдельный поток, до того как они загрузятся показывать прогрессбарчики, решит проблему с долгим запуском.

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: весь этот bitmap

Сообщение Foenix » 15 апр 2016, 12:44

да хоть сто на одном экране. Используй любую нормальную библиотеку на выбор, например, Picasso.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
Lisa
Сообщения: 22
Зарегистрирован: 16 ноя 2015, 14:29

Re: весь этот bitmap

Сообщение Lisa » 15 апр 2016, 13:54

Спасибо) вроде работает нормально

Аватара пользователя
Mikhail_dev
Сообщения: 2386
Зарегистрирован: 09 янв 2012, 14:45
Откуда: Самара

Re: весь этот bitmap

Сообщение Mikhail_dev » 15 апр 2016, 16:21

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

Аватара пользователя
Lisa
Сообщения: 22
Зарегистрирован: 16 ноя 2015, 14:29

Re: весь этот bitmap

Сообщение Lisa » 16 апр 2016, 16:10

Я почитала 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

Ответить