[исходный код проекта можно скачать здесь]
Создадим новый проект в Clickable, в терминале вводим команду:
clickable create
Выбираем тип проекта Python и заполняем:
Title [App Title]: Rendering RGBA
App Name [appname]: example-RGBA
В файл Main.qml удаляем Python объект, а объект Page приводим к виду:
Page {
anchors.fill: parent
header: PageHeader {
id: header
title: i18n.tr('Rendering RGBA')
}
Image {
id: image
fillMode: Image.PreserveAspectFit
anchors {
top: header.bottom
left: parent.left
right: parent.right
bottom: parent.bottom
}
Python {
Component.onCompleted: {
addImportPath(Qt.resolvedUrl('../src/'));
importModule('example', function () {
image.source = 'image://python/image-id-passed-from-qml';
});
}
onError: console.log('Python error: ' + traceback)
}
}
}
Таким образом на слое Page мы создали объект Image.
Внутри этого Image был создан объект обработки кода Python, который сработает при инициализации родителя(Image) и вернет ему срендеренное изображение.
Теперь папке проекта находим каталог src и изменим example.py.
import pyotherside
import math
def render(image_id, requested_size):
print('image_id: "{image_id}", size: {requested_size}'.format(**locals()))
# width and height will be -1 if not set in QML
if requested_size == (-1, -1):
requested_size = (300, 300)
width, height = requested_size
# center for circle
cx, cy = width/2, 10
pixels = []
for y in range(height):
for x in range(width):
pixels.extend(reversed([
255, # alpha
int(10 + 10 * ((x - y * 0.5) % 20)), # red
20 + 10 * (y % 20), # green
int(255 * abs(math.sin(0.3*math.sqrt((cx-x)**2 + (cy-y)**2)))) # blue
]))
return bytearray(pixels), (width, height), pyotherside.format_argb32
pyotherside.set_image_provider(render)
модули math и pyotherside уже по умолчанию установлены в Ubuntu Touch.
pyothersid позволяет нашему коду создавать и возвращать QML объекты.
Таким образом render вернет нам побайтовое изображение в формате pyotherside.format_argb32.
В ходе функции мы создаем двумерный массив байтов pixels, где каждый элемент содержит 4 байта - Альфа прозрачность(0-255), значение красного(0-255), зеленого(0-255) и синего(0-255) пикселя.
При помощи математический вычислений мы можем генерировать текстуры, и редактировать изображения.
Все что нам осталось, это открыть терминал в папке с проектом, подключить телефон и запустить компиляцию командой:
clickable
И на по следок еще одна функция генерации градиента:
def render(image_id, requested_size):
print('image_id: "{image_id}", size: {requested_size}'.format(**locals()))
# width and height will be -1 if not set in QML
if requested_size == (-1, -1):
requested_size = (300, 300)
width, height = requested_size
pixels = []
for y in range(height):
for x in range(width):
pixels.extend(reversed([
255, # alpha
int(round(255/width*x)), # red
int(round((255-255/width*x)*(1-y/width))), # green
int(round(255/height*y)) # blue
]))
return bytearray(pixels), (width, height), pyotherside.format_argb32