Меню Документы

Вход в систему

Облако тэгов

Python на Symbian S60: рисование (модуль graphics и объект Canvas) PDF Печать
( 16 Votes )
21.01.2009 19:23

Python на Symbian S60: рисование (модуль graphics и объект Canvas)

 

Модуль graphics

 

Данный модуль обеспечивает доступ к объектам и функциям для работы с изображениями. После подключения модуля есть возможность использовать объект Image. Создать его можно несколькими способами:

 

Image.new(size [, mode=’RGB16’])

Возвращает объект Image размером size (кортеж из двух чисел – длина и высота) и цветовой глубиной mode (по умолчанию ‘RGB16). mode может принимать следующее значения:

  1. ’1’ – черно-белое изображения (1 бит на пиксель);
  2. L – 256 оттенков цвета (8 бит на пиксель);
  3. RGB12’ – 4096 оттенков цвета (12 бит на пиксель);
  4. RGB16’ – 65536 оттенков цвета (16 бит на пиксель);
  5. RGB – 16.7 миллионов оттенков цвета (24 бит на пиксель).

 

Image.open(filename)

Открывает графический файл (форматы JPG и PNG) с именем filename (полный путь к файлу) и возвращает в виде объекта Image.

 

Кроме того, модуль содержит функцию для получения скриншота экрана:

screenshot()

Возвращает объект Image, содержащий изображения экрана. Отмечу, если программа, с которой снимают скриншот, использует вывод через OpenGL ES 3D, то изображение получается с искажениями.

 

Также, можно получить свойства графического файла:

Image.inspect(filename)

Возвращает словарь, элемент которого с ключом «size» содержит кортеж – длина и высота изображения filename,

 

Примечание: телефоны с Symbian 6 не поддерживают функции Image.open и Image.inspect.

 

Все объекты Image имеют следующие методы:

 

resize(newsize [, callback=None, keepaspect=0 ])

Изменяет размер изображения на newsize (кортеж). Если keepaspect указан и равен 1, то пропорции нового изображения будут такие, как у старого, иначе изображение получится строго заданного размера, т.е. произойдет искажение пропорций.

 

transpose(direction [, callback=None ])

Возвращает новое изображение, полученное на основе оригинала к которому была применена операция direction. Существует несколько их видов (все они константы модуля graphics):

  1. graphics.FLIP_LEFT_RIGHT – переворачивает слева направо;
  2. graphics.FLIP_TOP_BOTTOM – переворачивает снизу вверх;
  3. graphics.ROTATE_90 – поворачивает на 90 градусов по часовой стрелке;
  4. graphics.ROTATE_180 – поворачивает на 180 градусов;
  5. graphics.ROTATE_270 – поворачивает на 270 градусов.

 

load(filename [, callback=None ])

Открывает изображение с именем filename и заменяет им существующее изображение Image (их размеры должны быть одинаковы).

 

save(filename [,callback=None, format=None, quality=75, bpp=24, compression=’default’ ])

Сохраняет изображение Image в графическом файле filename. Поддерживаются форматы JPG и PNG – атрибут format (по умолчанию равен ‘.jpg’). Для ‘.jpg’ файлов можно указать qualite – число от 0 (лучшее сжатие) до 100 (лучшее качество). Для ‘.png’ аргумент bpp указывает битность (1, 8 или 24), а compression – компрессию:

  1. default – по умолчанию (компромисс между скоростью и качеством сжатия);
  2. best– максимальное сжатие, но медленная скорость;
  3. fast– быстро, но компрессия слабая;
  4. no – без сжатия (файл получается большим, но зато абсолютно без артефактов присущих формату JPG).

 

stop()

Указывает прервать выполнение асинхронных функций resize, transpose, load и save. Дело вот в чем, если при вызове этих функций не указан аргумент callback, то они становятся синхронными. Т.е. они прерывают выполнение программы до тех пор, пока операция не будет завершена (загрузка большого файла, например, может быть длительной по времени, и программа даже может «подвиснуть»).

А вот если мы указали callback (имя функции), то resize, transpose, load и save становятся асинхронными. Т.е. они не прерывают выполнение программы, и работа идет дальше, но после завершения процессов (например, сохранение) сразу вызывается функция callback. Так вот stop и указывать прервать все эти процессы досрочно.

Примечание: телефоны с Symbian 6 не поддерживают функции resize, transpose, load и save.

 

Image также имеет один аргумент:

 

size

Кортеж, первый элемент которого указывает длину изображения, второй – его ширину.

 

Кроме вышеописанных методов, объект Image имеет функции для рисования различных примитивов (простых фигур).

 

clear([ color = 0xffffff])

Очищает изображение и устанавливает его цвет – color.

 

point( (x, y) [, outline = 0xffffff [, width = 1]])

Рисует точку с координатами x, y, цветом  outline и диаметром width. Отмечу, цвет может задаваться не только как число в шестнадцатеричном представлении (0xRRGGBB), но и как кортеж из 3 чисел, каждый из которых отвечает за одну составляющую цвета – (red, green, blue). Диапазон чисел от 0 до 255. Коды цветов и в том и в ином виде можно найти в любом учебнике по web – программированию.

 

line( (x1, y1, x2, y2) [, outline = 0xffffff [, width = 1]])

Рисует линию с началом в точке x1, y1 и с концом в точке x2, y2, имеющего цвет outline и ширину width.

 

rectangle( (x1, y1, x2, y2) [, outline = 0xffffff [, fill = 0 [, width = 1]]])

Рисует прямоугольник с противоположными углами в точках x1, y1 и x2, y2, имеющего контур шириной width и цветом outline. Можно указать fill – цвет заливки (если его нет, то рисуется только контур).

 

polygon( (x1, y1, x2, y2, …, xN, yN) [, outline = 0xffffff [, fill = 0 [, width = 1]]])

Рисует многоугольник с углами в точках x1, y1, x2, y2 и т.д., имеющего контур шириной width и цветом outline. Можно указать fill – цвет заливки (если он не указан, то рисуется только контур).

 

ellipse( (x1, y1, x2, y2) [, outline = 0xffffff [, fill = 0 [, width = 1]]])

Рисует эллипс, вписанный в прямоугольник с углами в точках x1, y1 и x2, y2, имеющего контур шириной width и цветом outline. Можно указать fill – цвет заливки (если он не указан, то рисуется только контур).

 

pieslice( (x1, y1, x2, y2), start, end [, outline = 0xffffff [, fill = 0 [, width = 1]]])

Рисует сектор вырезанной из эллипса, вписанного в прямоугольник с углами в точках x1, y1 и x2, y2, имеющего контур шириной width и цветом outline. Аргументы start и end указывают начальный и конечный угол сектора. Углы отчитываются от правой полуоси и измеряются в радианах (0 – правый, pi/2 – верх, pi – левый, 2*pi/3 - низ). Можно указать fill – цвет заливки (если он не указан, то рисуется только контур).

 

arc( (x1, y1, x2, y2), start, end [, outline = 0xffffff [, width = 1]])

Рисует дугу вырезанную из эллипса, вписанного в прямоугольник с углами в точках x1, y1 и x2, y2, имеющего контур шириной width и цветом outline. Аргументы start и end указывают начальный и конечный угол сектора.

 

text( (x, y), text [, fill = 0xffffff [, font = None]])

Рисует текст text (строка в Unicode, т.е. можно вывести надпись и на русском) с началом в x, y, цветом fill и используя шрифт font (по умолчанию uLatinBold19’). Есть несколько вариантов указать шрифт:

1. непосредственно название шрифта в виде строки Unicode (их список можно получить функцией appuifw.available_fonts);

2. символьное обозначение шрифта:

  • ’normal’;
  • ’dense’;
  • ’title’;
  • ’symbol’;
  • ’legend’;
  • annotation.

3. использовать кортеж, первый элемент которого указывает имя шрифта (None –шрифт по умолчанию), второй – размер шрифта в пикселях (None – размер по умолчанию), третий (его может и не быть) – стиль шрифта:

  • graphics.FONT_BOLD (жирный);
  • graphics.FONT_ITALIC (наклоненный);
  • graphics.FONT_SUBSCRIPT (подстрочный);
  • graphics.FONT_SUPERSCRIPT (надстрочный);
  • graphics.FONT_ANTIALIAS (со сглаживанием)
  • graphics.FONT_NO_ANTIALIAS (без сглаживания);

Все эти стили являются константами модуля graphics и могут быть использованы одновременно используя логическую операцию И - «|».

 

measure_text(text [, font=None [, maxwidth = -1 [, maxadvance = -1 ]]])

Определяет тот размер изображения, в котором уместится нарисованный шрифтом font текст text. Можно указать maxwidth – максимальную ширину изображения, и maxadvance – максимальная высота курсора. Возвращает кортеж из трех элементов:

  1. кортеж вида (topleft - x, topleft - y, bottomright - x, bottomright - y) – прямоугольник, ограничивающий текст;
  2. число пикселей для графического курсора;
  3. количество символов текста, которое вписывается в полученный прямоугольник.

 

blit(image [, target = (0,0) [, source = ((0,0), image.size) [, mask = None [, scale = 0 ]]]])

Копирует изображение image на оригинальное изображение (т.е. image1.blit(image2) копирует image2 на image1). Можно указать: source – координаты и размер источника; target – координаты места назначения;  mask – черно-белое изображение (маска для image2), размер которого совпадает с размером копируемого участка и указывает, какие пиксели выводить, а какие нет; scale – масштабирование (использование этого атрибута замедляет выполнение операции).

Хотя эти функции и дают нам возможность работать с изображением Image, но чтобы вывести их на экран необходимо использовать другой объект – Canvas из модуля appuifw.

 

Объект Canvas

 

Данный объект представляет из себя «холст» который можно вывести на экран. Делается это как обычно – создаем объект и присваиваем его переменной appuifw.app.body. При создании же, можно указать несколько дополнительных аргументов:

Canvas( [redraw_callback = None [, event_callback = None [, resize_callback = None ]]])

1. redraw_callback – имя той функции, которая будет вызываться при обновлении экрана (после свертывания\развертывания программы, после выбора из меню Функции нужного пункта и т.д.). При вызове ей передается кортеж из 4 чисел -  координаты левого-верхнего и правого-нижнего угла обновляемой области;

2. event_callback – имя той функции, которая будет вызываться при нажатии на клавиши клавиатуры. При вызове ей передается словарь из 4 элементов:

            А) type – тип нажатия. Для определения используются переменные модуля graphics:

  • graphics.EEventKeyDown (нажатие клавишу);
  • graphics.EEventKeyUp (отпускание клавиши);
  • graphics.EEventKey (общее событие для нажатия).

                        Б) ‘keycode’ – код клавиши;

                        В) scancode – скан-код клавиши;

                        Г) modifiers – модификатор нажатия (обычное, удерживание и т.д.)

Все коды и скан-коды клавишей, модификаторы можно узнать из модуля key_codes (либо откройте и прочитайте файл key_codes.py с помощью любого текстового редактора, либо в интерактивной консоли Python подключите модуль командой import key_codes и просмотрите его содержимое командой dir(key_codes)). Вот часто используемые коды:

  • key_codes.EKeyLeftSoftkey – нажатие на левую-софт клавишу;
  • key_codes.EKeyRightSoftkey – нажатие на правую-софт клавишу;
  • key_codes.EKeyMenu – нажатие на кнопку Меню;
  • key_codes.EKey0...9 – нажатие на цифровые клавиши 0-9;
  • key_codes.EKeyStar – нажатие на клавишу «*»;
  • key_codes.EKeyHash – нажатие на клавишу «#»;
  • key_codes.EKeyLeftArrow – нажатие Влево;
  • key_codes.EKeyRightArrow  – нажатие Вправо;
  • key_codes.EKeyDownArrow  – нажатие Вниз;
  • key_codes.EKeyUpArrow  – нажатие Вверх;
  • key_codes.EKeySelect  – нажатие в центр джойстика (Выбор);
  • key_codes.EKeyEdit – нажатие на клавишу «карандаш»;
  • key_codes.EKeyBackspace – нажатие на клавишу «С»;
  • key_codes.EKeyNo – нажатие на клавишу Отбой.

3. resize_callback – имя той функции, которая будет вызываться при изменении размера видимой области экрана (например, при изменении переменной appuifw.app.screen). В качестве аргумента этой функции передается кортеж из 2 чисел – новая длина и высота.

После создания, все, что мы сделаем с Canvas, немедленно отобразится на экране. А какие методы у него есть? Это все функции для работы с изображением (resize, transpose, load, save), функции для рисования (clear, point, line, rectangle, polygon, ellipse, pieslice, arc, text, blit) и переменная size.



 

Комментарии  

 
0 #1 Димитрий 21.08.2010 16:04
Эта статья мне как-то не очень понятна
Без какого-нибудь примера трудно разобраться... Хотя бы чтобы появлялось просто белое поле, на кьтором нарисован квадрат.
ball.py мне не понятен совсем. Поэтому вся надежда на вас
Цитировать
 
© 2008-2009, Сообщество разработчиков приложений для мобильных устройств
Система Orphus
При использовании материалов ссылка на devmobile.ru обязательна.
Joomla 1.5 Templates, Powered by Joomla! and designed by SiteGround web hosting