У чому різниця між Bitmap та Drawable в Android?


Відповіді:


73

Бітмап - це зображення бітового зображення (щось на зразок java.awt.Image). Малюнок - це абстракція "того, що можна намалювати". Це може бути растрове зображення (загорнуте як a BitmapDrawable), але це також може бути однотонний колір, колекція інших об’єктів, що малюються, або будь-яка кількість інших структур.

Більшість фреймворків інтерфейсу Android любить працювати з об’єктами, що малюються, а не з об’єктами Bitmap. View може прийняти будь-який малюнок як фон. ImageView може відображати передній план для малювання. Зображення, що зберігаються як ресурси, завантажуються як об’єкти, які можна малювати.


3
якщо bitmapDrawable обгортає растрове зображення, що станеться, якщо ми викликаємо recycle () на растровому зображенні всередині нього? також, що робить recycle () для API11 і вище?
розробник android

@androiddeveloper - Я не впевнений, але це не буде нічим хорошим. Після того, як растрове зображення обертається BitmapDrawable, малювальний "володіє" растровим зображенням і повинен керувати його життям. Якщо ви телефонуєте recycle(), ви заважаєте цим стосункам. У кращому випадку малювальне нічого не намалює; швидше за все, якийсь виняток буде застосовано пізніше. Згідно з документами , recycle()API11 + робить те саме, що і завжди: це дозволяє звільнити власні пікселі, як тільки ви дізнаєтесь, що закінчили з ними.
Тед Хопп,

там кажуть, що це звільняє рідну пам'ять растрового зображення, але ми знаємо, що станом на API 11 все, що стосується растрового зображення (включаючи його вихідні дані), знаходиться всередині купи, тому переробка здається дивним, що потрібно робити ...
розробник android

@androiddeveloper - Дивлячись на джерело , здається, що все ще існує власне растрове зображення. З метою підвищення продуктивності вихідний буфер виставляється як загальнодоступний член (хоча все ще прихований від загальнодоступного API). Виклик recycle()все одно звільнить рідне растрове зображення; він також встановить для буфера-члена значення null.
Тед Хопп,

так, я теж це читав, але це не має сенсу, оскільки в Google IO сказали, що растрове зображення більше не зберігається в рідній пам'яті. я дійсно збентежений, як це могло бути.
розробник android

39

Малюнок - це те, що можна намалювати. Наприклад, макет, векторне зображення (лінія, коло), шрифт, зображення тощо

Бітмап - це певний тип малюваного зображення, який є зображенням, наприклад: PNG, JPEG тощо


10
Растровий ( android.graphics.Bitmap) не є підклас Drawable ( android.graphics.drawable.Drawable).
Тед Хопп,

Звичайно, це моя вина. Я мав на увазі BitmapDrawable
Barmaley

Але вони кажуть, що Bitmap: найпростіший малювальний файл, зображення PNG або JPEG. у документах.
mallaudin

1
Я думав, що вставив за цим посиланням. developer.android.com/guide/topics/resources/…
mallaudin

32

Растрове зображення - це не зображення. Bitmap - це карта бітів (назва примітки: Bit-map). І ця карта представляє пікселі, на яких ви можете щось намалювати. Це може бути ваш власний растровий малюнок (не зображення), наприклад квадрат:

Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);

або ви можете створити об'єкт Bitmap із зображення:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.your_image);    

Бітмап - це тримач пікселів. А Canvas використовується, щоб намалювати щось на вашому растровому зображенні (на растрових пікселях).

Все про Drawable добре описано вище.

TL; DR

Деякі люди пишуть, що ви малюєте на полотні. Ви не малюєте на полотні. Ви використовуєте растрові пікселі за допомогою допоміжного методу Canvas.

Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
canvas.drawColor(Color.RED) // now all bitmap pixels became red

Приємна відповідь заслуговує +1 :) Дякую за пояснення за рядками коду.
HarshitMadhav

чудово пояснено
Тушар Шрівастава

14

Ресурс, який можна залучити

DrawableРесурс є загальне поняття для графіки , яка може бути звернено на екран , і які ви можете отримати з API , такі як getDrawable(int)або застосувати до іншого XML - ресурс з атрибутами , такими як android:drawableі android:icon. Існує кілька різних типів висувних матеріалів:

  • Файл Bitmap, графічний файл Bitmap (.png, .jpg або .gif), створює файл BitmapDrawable.

  • Файл Nine-Patch , PNGфайл із розтяжними областями, що дозволяє змінювати розмір зображення на основі вмісту (.9.png), створює файл NinePatchDrawable.

  • Список шарів , A, Drawableякий управляє масивом інших Drawables. Вони малюються в порядку масивів, тому елемент з найбільшим індексом малюється зверху, створює a LayerDrawable.

  • СписокXML станів , файл, який посилається на різні растрові графічні зображення для різних станів (наприклад, для використання іншого зображення при натисканні кнопки), створює файл StateListDrawable.

  • Список рівнів , XMLфайл, який визначає a, Drawableякий управляє кількістю альтернативних Drawables, кожному з яких присвоєно максимальне числове значення, створює a LevelListDrawable.

  • Перехідний Drawable , XMLфайл, який визначає, Drawableщо може перехресно згасати між двома Drawableресурсами, створює файл TransitionDrawable.

  • Inset Drawable , XMLфайл, який визначає файл, який вставляєDrawable інший Drawableна певну відстань. Це корисно, коли Viewпотрібен фон Drawble, менший за фактичні межі подання.

  • Clip Drawable , XMLфайл, який визначає, Drawableщо відсікає інший Drawableна основі Drawableпоточного значення цього рівня, створює файл ClipDrawable.

  • Scale Drawable , XMLфайл, який визначає a, Drawableякий змінює розмір іншого Drawableна основі його поточного значення рівня, створює a ScaleDrawable.

  • Shape Drawable , XMLфайл, який визначає геометричну фігуру, включаючи кольори та градієнти, створює файл ShapeDrawable.

Також див. Документ "Анімаційний ресурс" про те, як створити файл AnimationDrawable.

Примітка: Колір ресурс також може бути використаний в якості Ddrawableін XML. Наприклад, створюючи a StateListDrawable, ви можете посилатися на кольоровий ресурс для android:drawableатрибута ( android:drawable="@color/green").

Растрове зображення

Растрове зображення. Android підтримує растрові файли у трьох форматах: .png (бажано), .jpg (прийнятно), .gif (не рекомендується).

Ви можете посилатися на файл растрових зображень безпосередньо, використовуючи ім'я файлу як ідентифікатор ресурсу, або створити ідентифікатор псевдоніма в XML.

Примітка: Файли растрових зображень можуть автоматично оптимізуватися за допомогою стиснення зображень без втрат інструментом aapt під час процесу побудови. Наприклад, справжній колір PNG, для якого не потрібно більше 256 кольорів, може бути перетворений у 8-розрядний PNG із кольоровою палітрою. Це призведе до зображення однакової якості, але яке вимагає менше пам'яті. Тому майте на увазі, що двійкові файли зображень, розміщені в цьому каталозі, можуть змінюватися під час побудови. Якщо ви плануєте читати зображення як бітовий потік, щоб перетворити його у растрове зображення, розмістіть зображення в res/raw/папці, де вони не будуть оптимізовані.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.