Я пытаюсь реализовать инструмент 'Bucket fill' для холста QML, используя алгоритм заливки.Моя начальная реализация в чистом QML / Javascript работает хорошо, но (как и ожидалось) медленно и по существу непригодна для мобильных устройств.
Я бы хотел вместо этого реализовать ее на C ++.К сожалению, совместное использование содержимого холста QML с C ++ не просто / не поддерживается / не документировано.
Мой текущий подход запутан и, конечно, не эффективен: сначала я сериализирую содержимое холста, используя canvas.dataToUrl("image/bmp")
, я передаюИзображение в кодировке base64 для плагина C ++ QML, который выполняет заливку:
void FloodFill::setImageData(const QString &data)
{
QByteArray base64Data = data.mid(22).toUtf8();
QImage image;
image.loadFromData(QByteArray::fromBase64(base64Data), "BMP");
fill(image);
emit onCanvasFilled();
}
Затем, при следующей перерисовке холста QML, я получаю доступ к C ++ QImage
, перекодируя его в base64 на стороне C ++,и затем использование строки base64 в качестве источника изображения в QML.
В итоге: canvas -> base64 кодирование с помощью toUrlData
-> C ++ -> декодирование в QImage
-> floodfill -> перекодировать в строку base64 -> декодировать как изображение QML -> закрасить изображение QML поверх холста.
Это явно крайне неэффективно.
В идеале я хотел бы получить доступадрес памяти холста 'CanvasImageData
из C ++ для непосредственного редактирования пикселей без какой-либо копии.
Следующим лучшим вариантом будет копирование в обоих направлениях CanvasImageData
(нотип C ++ для CanvasImageData
к сожалению, личное).
Любые другие предложения?
(Хочу добавить, что я также посмотрел на интерфейс QImageProvider
, но не вижу, как я могу заставить его работатьв этой ситуации, поскольку поставщик изображений должен быть запущен в моем плагине QML, и я не понимаю, как я мог бы тогда зарегистрировать поставщик изображений с помощью механизма QML).