Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
verylazy
Заблокирован
#1

Bitmap & BitmapFactory - Программирование Android

08.08.2013, 15:37. Просмотров 1467. Ответов 10
Метки нет (Все метки)

Вопрос к бывалым.

У меня в метод передается параметр Byte[] data и дальше я из этого массива байт пытаюсь сделать битмап
Java
1
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
все чудесно работает, но(!) эта строка отрабатывает на эмуляторе почти 1 секунду
массив длиной меньше 25000, замеряю время через System.nanoTime()
я через каждую строку расставил счетчики и ошибка, мне кажется, исключена - именно эта строка вносит почти секундную задержку
остальные строки пролетают быстро

это вообще нормально, кто-то сталкивался с похожим?

дальше там еще хуже, я этот битмап пытаюсь повернуть на 90 градусов с помощью класса Maxtix, там вообще процесс идет 2 с хвостиком секунды
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.08.2013, 15:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Bitmap & BitmapFactory (Программирование Android):

BitmapFactory.decodeFile всегда возвращает null - Программирование Android
Выбираю картинку с галереи, получаю полный путь к файлу, но BitmapFactory.decodeFile(filename) всегда возвращает null. Почему?

BitmapFactory не может обработать большое изображение с камеры - Программирование Android
Фотографирую, получаю byte data. Далее Bitmap bmp; BitmapFactory.Options options = new BitmapFactory.Options(); ...

Как все png файлы проекта взять в BitmapFactory.decodeResource? - Программирование Android
все файлы, около 100 - слайды, находятся в папке raw. Как их от туда взять в переменную Bitmap, оставив название файла как имя переменной?

Bitmap трансформация - Программирование Android
Здрасте) Как можно трансформировать bitmap? Т.е. у меня есть картинка, которую я загружаю, и мне её надо сжать один край, из...

Bitmap, resize - Программирование Android
При ресайзе bitmap теряет "резкость" по контуру изображения, появляется пикселизация. Есть способы обойти это? Ресайзю bitmap путем...

создание Bitmap - Программирование Android
столкнулся с такой проблемой: есть в drawable imge.jpg , делаю в классе class MClass extends View Bitmap bm1 =...

10
GiGaBiTe911
24 / 24 / 1
Регистрация: 04.02.2013
Сообщений: 132
Записей в блоге: 1
08.08.2013, 15:49 #2
да, у меня примерно так же. точное время не замерял, но достаточно долго.
1
verylazy
Заблокирован
08.08.2013, 15:55  [ТС] #3
о, уже статистика накапливается, спасибо
попробую переписать поворот не через класс Matrix, посмотрим что получится

Не по теме:

живо представляю mutagen, который грозно смотрит и качая головой говорит - ох школота...со своими оптимизациями

0
mechlech
08.08.2013, 16:13
  #4

Не по теме:

Цитата Сообщение от verylazy Посмотреть сообщение
mutagen, который грозно смотрит и качая головой говорит - ох школота
"Не сотвори себе кумира"

0
verylazy
Заблокирован
08.08.2013, 18:00  [ТС] #5
почитал, ничего толкового не нашел, все пользуются этими классами

вдруг кому пригодится - на одном ресурсе увидел что рекомендуют ставить
Java
1
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
попробовал, метод ускорился в 5-6 раз, мне понравилось, но чувствую что использовать нужно без фанатизма, только в экстренных случаях
0
GiGaBiTe911
24 / 24 / 1
Регистрация: 04.02.2013
Сообщений: 132
Записей в блоге: 1
08.08.2013, 18:41 #6
Цитата Сообщение от verylazy Посмотреть сообщение
но чувствую что использовать нужно без фанатизма, только в экстренных случаях
ну понятное дело )) этим ты выставляешь своему процессу максимальный приоритет и он забирает на себя максимально доступное процессорное время, тем самым "ущемляя" другие процессы. и мне кажеЦа что после завершения своих "магических" действий с битмапом нужно не забыть обратно выставить нормальный приоритет сейчас попробую у себя.
0
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
08.08.2013, 19:13 #7
Во первых:
тестируйте на реальном устройстве а не на эмуляторе.
если нету девайса - тестируйте на вменяемом эмуляторе (я использую genymotion)

Во вторых:
длинные операции стоит выносить в отдельные потоки (выставление приоритетов делать не стоит так это не приоритетная задача)

В третьих:
откуда у вас берутся эти байтаррэи? вы храните битмапы базе данных?
1
verylazy
Заблокирован
08.08.2013, 21:15  [ТС] #8
Цитата Сообщение от YAUHEN Посмотреть сообщение
Во первых:
тестируйте на реальном устройстве а не на эмуляторе.
если нету девайса - тестируйте на вменяемом эмуляторе (я использую genymotion)

Во вторых:
длинные операции стоит выносить в отдельные потоки (выставление приоритетов делать не стоит так это не приоритетная задача)

В третьих:
откуда у вас берутся эти байтаррэи? вы храните битмапы базе данных?
за ссылку спасибо, я даже и не предполагал что есть такие штуки
буду читать что оно и как ставить

насчет длинных операций я понимаю
эти байт массивы это то, что прилетает в onTakePicture
Я вникаю во все это, пробую, вот подумал что было бы неплохо вынести обработку снимков с камеры и добавление их на экран и виде маленьких превьюшек в отдельный поток.
Для этого наследовался от класса AsyncTask и разнес код по двум методам - doInBackground и onPostExecute
В первом и происходит возня с этими массивами, а во втором я уже добавляю на экран готовый ImageView.
Приоритет потоку добавлял уже в самом конце метода doInBackground , когда осталось только сделать bitmap и повернуть его (если требовалось).
Надеюсь все правильно делаю.
0
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
09.08.2013, 12:08 #9
я могу ошибаться но если вы сохранили картинку её потом можно как тамбнейл вытянуть

Добавлено через 47 минут
вот
0
verylazy
Заблокирован
09.08.2013, 16:00  [ТС] #10
код, который ниже выдает результат, который не совсем понятен для меня
это самое начало метода onPictureTaken
Java
1
2
3
4
5
6
            System.out.println("--1 " + data.length);
            bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
            System.out.println("--2 ");
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(CompressFormat.JPEG, 100,  baos);
            System.out.println("--3 " + baos.size());
я попытался слегка упаковать картинку, но data.length выдает 25525
а размер массива baos получается уже 33005, то есть больше, чем оригинал

не совсем корректно сравнивать теплое и мягкое, но я не могу понять как все таки паковать картинку с разным качеством jpg?
0
YAUHEN
146 / 128 / 6
Регистрация: 29.07.2008
Сообщений: 506
09.08.2013, 17:44 #11
так вы упакавали картинку просто в JPG без потери качества. не факт что она должна была быть меньше. попробуте поставить 50 в методе compress
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2013, 17:44
Привет! Вот еще темы с ответами:

RelativeLayout и Bitmap - Программирование Android
Можно ли поставить на задний фон RelativeLayout Bitmap. Или преобразовать Bitmap в Drawable? P.S. Именно Bitmap, а не BitmapDrawable/

Не создаёт Bitmap из ресурса - Программирование Android
Android только-только начал осваивать - не пинайте, пожалуйста, если вопрос тривиальный. Имею Android Studio 1.5.1 и некий проект. Есть...

Очистка памяти Bitmap - Программирование Android
В фрагменте динамически создаются ImageView, после закрытия фрагмента они все исчезают, нужно ли в коде всякие recycle делать чтобы...

Неверный размер Bitmap'a - Программирование Android
Всем привет! Загружаю картинку размером 1920х1080: bmp = BitmapFactory.decodeResource(getResources(), R.drawable.bmp); Затем вывожу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Yandex
Объявления
09.08.2013, 17:44
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru