Developer от Бога

DV

пятница, 7 июля 2017 г.

Android. Bitmap. Canvas. Рисование


Графика в Android имеет важнейшее значение для разработчиков. Это одна из самых разнообразных и трудных тем в программировании, имеет много решений для любой ситуации. Обычный файл изображения несет в себе много разной информации в зависимости от формата, но самая главная его часть это - данные пикселей, такие как цвет и координаты. Для доступа к ним в Android есть класс - Bitmap (карта точек). Через него можно читать, изменять, записывать, и преобразовывать пиксели в удобную форму ( например в массив для обработки в цикле), а также делать более глобальные вещи : изменять размеры изображений и манипулировать им в пространстве. Простейший и один из самых главных действий с Bitmap это - загрузка изображения с выводом на экран:



  1. Bitmap bitmap = BitmapFactory.decodeResource( context.getResources() , R.drawable.image);
  2. ImageView.setImageBitmap(bitmap);
  3. int hColor = 0;
  4. int r, g, b;
  5. for (int x = 0; x < bitmap.getWidth(); x++)
  6. for (int y = y; y < bitmap.getHeight(); y++) {
  7. hColor = bitmap.getPixel(x, y);
  8. r = (hColor>>16)&0xff;
  9. g = (hColor>>8)&0xff;
  10. b = hColor&0xff;
  11. bitmap.setPixel(x, y, Color.rgb( r/2, g/2, b/2));
  12. } tmap.setPixel(x, y, Color.rgb( r/2, g/2, b/2));



Каждый пиксель физически состоит из трех пикселей главных цветов. Есть более простой способ чтения цвета пикселя, однако он в несколько раз медленнее :


  1. r = Color.red(bitmap.getPixel(x, y));
  2. g = Color.green(bitmap.getPixel(x, y));
  3. b = Color.blue(bitmap.getPixel(x, y));  



Работа напрямую с Bitmap эффективна при работе с изображением в глобальном плане, однако когда необходимо выводить стандартные фигуры ( текст, линии , прямоугольники, круги, эллипсы, заливка цветом и другое) более эффективно использовать класс Canvas. Он сам решает математику по рисованию фигур в двумерном пространстве на пикселях. Более того, по возможности нужно всегда использовать стандартные классы в Android, так как они имеют хорошую оптимизацию на уровне виртуальной машины ( глубже на уровне железа ) всегда будут работать быстрее пользовательских решений подобных задач, используя неявные связи между Bitmap и виртуальной машиной. Если для заливки Bitmap цветом нужно использовать цикл, и перебрать все пиксели, что займет некоторое время, то класс Canvas справится с этим практически мгновенно. Объект данного класса принимает в конструктор Bitmap, на котором нужно рисовать, и объект типа Paint который задает параметры кисти.


  1. Canvas canvas = new Canvas(bitmap);
  2. canvas.drawLine(x, y, x + a, y + b, Paint);
  3. ...
  4. canvas.drawRect(x, y, x + a, y + b, Paint);
  5. ImageView.setImageBitmap(bitmap); , Paint);


Описывать все методы рисования Canvas не имеет смысла, они просты и в документации достаточно описаны. В самом Android SDK эти методы также можно посмотреть.

Комментариев нет:

Отправить комментарий