diff --git a/src/QZXing.h b/src/QZXing.h index a28538b..fc356f2 100644 --- a/src/QZXing.h +++ b/src/QZXing.h @@ -13,7 +13,7 @@ #include #endif -#include +#include "QZXingImageProvider.h" // forward declaration namespace zxing { @@ -120,8 +120,8 @@ public slots: * of a portion of the image. (Suggested for Qt 4.x) */ QString decodeSubImageQML(QObject *item, - const double offsetX = 0 , const double offsetY = 0, - const double width = 0, const double height = 0); + const int offsetX = 0, const int offsetY = 0, + const int width = 0, const int height = 0); /** * The decoding function accessible from QML. (Suggested for Qt 5.x) @@ -138,8 +138,8 @@ public slots: * (Suggested for Qt 5.x) */ QString decodeSubImageQML(const QUrl &imageUrl, - const double offsetX = 0, const double offsetY = 0, - const double width = 0, const double height = 0); + const int offsetX = 0, const int offsetY = 0, + const int width = 0, const int height = 0); /** * The main encoding function. Currently supports only Qr code encoding diff --git a/src/imagehandler.cpp b/src/imagehandler.cpp index 74826b0..c3d8c49 100644 --- a/src/imagehandler.cpp +++ b/src/imagehandler.cpp @@ -4,16 +4,47 @@ #include #include #include +#include +#include +#include +#include +#include ImageHandler::ImageHandler(QObject *parent) : QObject(parent) { } -QImage ImageHandler::extractQImage(QObject *imageObj, - const double offsetX, const double offsetY, - const double width, const double height) +QImage ImageHandler::extractQImage(QObject *imageObj, int offsetX, int offsetY, int width, int height) { +#if QT_VERSION >= 0x050000 + QQuickItem *item = qobject_cast(imageObj); + + if (!item || !item->window()->isVisible()) { + qDebug() << "Item is NULL"; + return QImage(); + } + + QTime timer; + timer.start(); + QSharedPointer result = item->grabToImage(); + pendingGrabbersLocker.lockForWrite(); + pendingGrabbers << result.data(); + pendingGrabbersLocker.unlock(); + + connect(result.data(), &QQuickItemGrabResult::ready, this, &ImageHandler::imageGrabberReady); + while (timer.elapsed() < 1000) { + pendingGrabbersLocker.lockForRead(); + if (!pendingGrabbers.contains(result.data())) { + pendingGrabbersLocker.unlock(); + break; + } + pendingGrabbersLocker.unlock(); + qApp->processEvents(); + QThread::yieldCurrentThread(); + } + QImage img = result->image(); +#else QGraphicsObject *item = qobject_cast(imageObj); if (!item) { @@ -26,20 +57,37 @@ QImage ImageHandler::extractQImage(QObject *imageObj, QPainter painter(&img); QStyleOptionGraphicsItem styleOption; item->paint(&painter, &styleOption); +#endif - if(offsetX == 0 && offsetY == 0 && width == 0 && height == 0) - return img; - else - { + if (offsetX < 0) + offsetX = 0; + if (offsetY < 0) + offsetY = 0; + if (width < 0) + width = 0; + if (height < 0) + height = 0; + + if (offsetX || offsetY || width || height) return img.copy(offsetX, offsetY, width, height); - } + else + return img; } void ImageHandler::save(QObject *imageObj, const QString &path, - const double offsetX, const double offsetY, - const double width, const double height) + const int offsetX, const int offsetY, + const int width, const int height) { QImage img = extractQImage(imageObj, offsetX, offsetY, width, height); img.save(path); } +#if QT_VERSION >= 0x050000 + void ImageHandler::imageGrabberReady() + { + pendingGrabbersLocker.lockForWrite(); + pendingGrabbers.remove(sender()); + pendingGrabbersLocker.unlock(); + } +#endif + diff --git a/src/imagehandler.h b/src/imagehandler.h index ce1022e..6624eda 100644 --- a/src/imagehandler.h +++ b/src/imagehandler.h @@ -3,6 +3,10 @@ #include #include +#if QT_VERSION >= 0x050000 +#include +#include +#endif class ImageHandler : public QObject { @@ -11,13 +15,19 @@ public: explicit ImageHandler(QObject *parent = 0); QImage extractQImage(QObject *imageObj, - const double offsetX = 0 , const double offsetY = 0, - const double width = 0, const double height = 0); + int offsetX = 0, int offsetY = 0, + int width = 0, int height = 0); public slots: void save(QObject *item, const QString &path, - const double offsetX = 0, const double offsetY = 0, - const double width = 0, const double height = 0); + const int offsetX = 0, const int offsetY = 0, + const int width = 0, const int height = 0); +private: +#if QT_VERSION >= 0x050000 + void imageGrabberReady(); + QSet pendingGrabbers; + QReadWriteLock pendingGrabbersLocker; +#endif }; #endif // IMAGEHANDLER_H diff --git a/src/qzxing.cpp b/src/qzxing.cpp index 8cbcaab..441e88a 100644 --- a/src/qzxing.cpp +++ b/src/qzxing.cpp @@ -9,11 +9,16 @@ #include "imagehandler.h" #include #include +#include #include #include #include #include +#include +#include +#include + using namespace zxing; QZXing::QZXing(QObject *parent) : QObject(parent), tryHarder_(false) @@ -373,8 +378,8 @@ QString QZXing::decodeImageQML(QObject *item) } QString QZXing::decodeSubImageQML(QObject *item, - const double offsetX, const double offsetY, - const double width, const double height) + const int offsetX, const int offsetY, + const int width, const int height) { if(item == NULL) { @@ -394,21 +399,31 @@ QString QZXing::decodeImageQML(const QUrl &imageUrl) } QString QZXing::decodeSubImageQML(const QUrl &imageUrl, - const double offsetX, const double offsetY, - const double width, const double height) + const int offsetX, const int offsetY, + const int width, const int height) { QString imagePath = imageUrl.path(); imagePath = imagePath.trimmed(); - QFile file(imagePath); - if (!file.exists()) { - qDebug() << "[decodeSubImageQML()] The file" << file.fileName() << "does not exist."; - emit decodingFinished(false); - return ""; + QImage img; + if (imageUrl.scheme() == "image") { + if (imagePath.startsWith("/")) + imagePath = imagePath.right(imagePath.length() - 1); + QQmlEngine *engine = QQmlEngine::contextForObject(this)->engine(); + QQuickImageProvider *imageProvider = static_cast(engine->imageProvider(imageUrl.host())); + QSize imgSize; + img = imageProvider->requestImage(imagePath, &imgSize, QSize()); + } else { + QFileInfo fileInfo(imagePath); + if (!fileInfo.exists()) { + qDebug() << "[decodeSubImageQML()] The file" << imagePath << "does not exist."; + emit decodingFinished(false); + return ""; + } + img = QImage(imagePath); } - QImage img(imageUrl.path()); - if(!(offsetX == 0 && offsetY == 0 && width == 0 && height == 0)) { + + if (offsetX || offsetY || width || height) img = img.copy(offsetX, offsetY, width, height); - } return decodeImage(img); }