Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
verylazy
Заблокирован
#1

Bitmap & BitmapFactory

08.08.2013, 15:37. Просмотров 1646. Ответов 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
Ответы с готовыми решениями:

BitmapFactory.decodeFile всегда возвращает null
Выбираю картинку с галереи, получаю полный путь к файлу, но...

BitmapFactory не может обработать большое изображение с камеры
Фотографирую, получаю byte data. Далее Bitmap bmp; BitmapFactory.Options...

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

Bitmap трансформация
Здрасте) Как можно трансформировать bitmap? Т.е. у меня есть картинка,...

RelativeLayout и Bitmap
Можно ли поставить на задний фон RelativeLayout Bitmap. Или преобразовать...

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, который грозно смотрит и качая головой говорит - ох школота...со своими оптимизациями :D

0
mechlech
08.08.2013, 16:13
  #4

Не по теме:

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

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
09.08.2013, 17:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.08.2013, 17:44

Bitmap, resize
При ресайзе bitmap теряет "резкость" по контуру изображения, появляется...

создание Bitmap
столкнулся с такой проблемой: есть в drawable imge.jpg , делаю в классе ...

Очистка памяти Bitmap
В фрагменте динамически создаются ImageView, после закрытия фрагмента они все...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

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