kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
android developer
android developer
Вопрос

Проверить наличие прозрачности & загружать только значения RGB

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

Есть ли способ проверить, имеет ли данный файл изображения (.png файл) прозрачность, используя API, не проверяя каждый пиксель в нем?

Если изображение не имеет прозрачности, то лучше всего использовать другой растровый формат, который использует только значения RGB.

Проблема в том, что Android также не имеет формата только для 3 цветов. Только RGB_565, который, по их словам, ухудшает качество изображения и в котором должна быть включена функция дизеринга.

Есть ли способ считывать только значения RGB и показывать их?

1 2012-08-22T19:26:36+00:00 3
Nikola K.
Nikola K.
Редактировал вопрос 22-го сентября 2012 в 9:30
Программирование
rgb
android
bitmap
alpha-transparency
Этот вопрос имеет 1 ответ на английском, чтобы прочитать их войдите в свой аккаунт.
 Simon
Simon
2-го февраля 2014 в 12:00
2014-02-02T12:00:13+00:00
Дополнительно
Источник
Редактировать
#17020050

Для меня bitmap.hasAlpha() отлично работает, чтобы сначала проверить, имеет ли битмап альфа-значения. После этого нужно пробежаться по пикселям и создать второй битмап без альфы.

2
0
 zapl
zapl
22-го августа 2012 в 9:32
2012-08-22T21:32:44+00:00
Дополнительно
Источник
Редактировать
#17020034

Давайте начнем немного не по теме.

проблема в том, что android также не имеет формата только для 3 цветов. только RGB_565, который, как они говорят, ухудшает качество изображения и который должен иметь включенную функцию дизеринга.

Причина этой проблемы не является специфичной для Android. Речь идет о производительности при рисовании изображений. Наилучшая производительность достигается, если пиксельные данные помещаются точно в 1 32-битную ячейку памяти.

Поэтому наиболее подходящим форматом пикселей является формат ARGB_8888, который использует ровно 32 бита (24 для цвета, 8 для альфы). При рисовании вам не нужно делать ничего, кроме как перебирать данные изображения, и каждая прочитанная ячейка может быть отрисована напрямую. Единственным недостатком является требуемая память для работы с такими изображениями, как когда они просто находятся в памяти, так и во время их отображения, поскольку графическое оборудование должно передавать больше данных.

Второй лучший вариант - использовать формат, при котором несколько пикселей помещаются в одну ячейку. При использовании 2 пикселей в 32 битах у вас остается 16 бит на пиксель, а одним из форматов, использующих 16 бит, является формат 565. 5бит красный, 6бит зеленый, 5бит синий. При рисовании вы все еще можете работать с ячейками памяти по отдельности, и все, что вам нужно сделать, это разделить 1 ячейку на части. Из-за меньшего объема памяти, необходимого для изображений, рисование иногда может быть даже быстрее, чем при использовании 32-битных цветов. Поскольку в начале развития android память была гораздо большей проблемой, они выбрали этот формат по умолчанию.

И худшая категория форматов - это те, где пиксели не помещаются в ячейки. Если взять только 3 цвета, то получится 24 бита, а их нужно распределить на 2 ячейки в 3 случаях из 4. Например, второй пиксель будет использовать оставшиеся 8 бит из первой ячейки и первые 16 бит из следующей ячейки. Дополнительная работа, необходимая для работы с 24-битными цветами, настолько велика, что она не используется. К тому же при рисовании изображений обычно в какой-то момент все равно появляется альфа, а если нет, то просто используется 32 бит, но альфа-биты игнорируются.

Так что 16-битный подход выглядит уродливо; 24-битный подход не имеет смысла. А поскольку ограничения памяти в Android уже не такие жесткие, как раньше, а аппаратное обеспечение стало быстрее, Android перешел на 32-битный формат по умолчанию (более подробно об этом рассказано на сайте http://www.curious-creature.org/2010/12/08/bitmap-quality-banding-and-dithering/).


Вернемся к вашему реальному вопросу

Есть ли способ проверить, имеет ли данный файл изображения (png файл) прозрачность, используя API, не проверяя каждый пиксель в нем?

Я не знаю. Но изображения JPEG не поддерживают альфа-канал, а изображения PNG обычно имеют альфа-канал. Вы можете просто злоупотребить расширением файла, чтобы получить его в большинстве случаев.

Но я бы посоветовал вам не заморачиваться со всем этим и просто использовать ARGB_8888 и применять хорошие техники загрузки изображений, описанные в документации Android Training о Displaying Bitmaps Efficiently.

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

 zapl
zapl
Редактировал ответ 22-го августа 2012 в 9:47
1
0
Решение / Ответ
android developer
android developer
24-го августа 2012 в 10:36
2012-08-24T10:36:30+00:00
Дополнительно
Источник
Редактировать
#17020045

Я'нашел следующие ссылки, которые могут быть полезны для проверки прозрачности png файла. к сожалению, это решение только для png файлов. остальные файлы (такие как webP, bmp, ...) должны иметь другой парсер.

ссылки:

http://www.java2s.com/Code/Java/2D-Graphics-GUI/PNGDecoder.htm

http://hg.l33tlabs.org/twl/file/tip/src/de/matthiasmann/twl/utils/PNGDecoder.java

http://www.java-gaming.org/index.php/topic,24202

0
0
Похожие сообщества 18
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
19 732 пользователей
Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. Размещение бесплатное. 📌 ВАЖНО: Правила публикации и правила канала: 📌 Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-12-10
Открыть telegram
StartAndroid Ru Chat
StartAndroid Ru Chat
2 849 пользователей
Android чат сайта startandroid.ru Канал - @startandroid
Открыть telegram
Android Architecture
Android Architecture
2 750 пользователей
Русскоязычный чат для обсуждения архитектуры Android приложений. У нас атмосфера взаимопомощи и уважения друг к другу! Общий чат по Android: @android_ru Чат для вакансий: @mobile_jobs Подробнее: https://telegra.ph/Android-Architecture-06-02
Открыть telegram
Android Declarative
Android Declarative
1 780 пользователей
Чат русскоязычного android-сообщества, посвященный декларативным UI-фреймворкам: Jetpack Compose, Anko, Anvil, Litho, Splitties за оффтопик пожизненная ссылка в @android_ru @jetpack_compose - новости https://bit.ly/32pRDWm - примеры компонентов
Открыть telegram
AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
1 684 пользователей
Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно 1раз в 2 недели ставьте в тексте тег #vacancy. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov Флудить тут @pogromista
Открыть telegram
Android ROM Development
Android ROM Development
1 649 пользователей
Discussion about Android ROM development and testing. App development group: 🖥 https://t.me/joinchat/CiGS0z9LkBPQ_8gjz3eAdA
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 5 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией