QMLのImageでイメージデータのフォーマットを設定できますか?



  • Qt、QML、初心者です。
    C++側のクラス、QImageには、イメージフォーマット(Format_ARGB32等)を明示的に指定できるパラメータが
    存在しているようなのですが、QML側のImageには、フォーマットを設定する項目がみあたりません。
    QMLのImageで描画する場合の画像フォーマットを設定することは可能でしょうか?
    (Imageの内部では一律32ビットで扱われているのでしょうか?)

    画像データを大量に扱うプログラムを作成中なのですが、メモリの空き容量が少なくなっています。
    QMLのImageが握っているリソース、描画処理で扱う画像のフォーマット(ビット数)を小さくすれば、
    メモリの使用量が減るのではないかと考えているのですが・・・



  • QMLのImageではフォーマット(デプス)を直接指定する仕組みはありません。通常は元となる画像の形式、あるいは画面表示用に最適化された形式を使用します。デスクトップ向けでは多くの場合32ビットになると思います。

    Image の設定ではありませんが、 QQuickImageProvider( http://qt-project.org/doc/qt-5/qquickimageprovider.html )を使用することでカスタマイズした画像を取得することができます。この中でフォーマットを変更した QImage を返せば目的に近い処理にはなると思います。

    ただし、内部で画面表示用などのデータを別に持つ可能性もあるのでメモリ使用量が減るかどうかは試してみないと何とも言えません。



  • ご回答ありがとうございます。
    QMLにはそういった仕組みがない、ということですので、
    C++でQImageを使用して、メモリ削減できるか検証してみます。



  • Qt5.3、組み込みLinux環境で、
    ご教示頂いた、QQuickImageProvider、を試してみました。
    目視での確認ですが、QMLのImageで表示される画像のフォーマットを、
    変更できているようです。
    ですが、残念ながらメモリ削減については明確な効果が確認できませんでした。
    (内部データが32ビットで処理されている可能性は高そうです...)
    ご参考までに。

    [localimgprov.h]
    @
    #ifndef LOCALIMGPROV_H
    #define LOCALIMGPROV_H

    #include <QQuickImageProvider>

    class localimgprov : public QQuickImageProvider
    {
    public:
    localimgprov();
    ~localimgprov();
    QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize);
    };

    #endif // LOCALIMGPROV_H
    @

    [localimgprov.cpp]
    @
    #include <qimage.h>
    #include "localimgprov.h"

    localimgprov::localimgprov()
    : QQuickImageProvider(QQuickImageProvider::Pixmap)
    {
    }

    localimgprov::~localimgprov()
    {
    }

    QPixmap localimgprov::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
    {
    QImage img;
    bool ret = img.load(id);
    //フォーマットを変更
    // QImage img2 = img.convertToFormat(QImage::Format_ARGB32);
    QImage img2 = img.convertToFormatQImage::Format_ARGB4444_Premultiplied);
    // QImage img2 = img.convertToFormat(QImage::Format_Indexed8);
    return QPixmap::fromImage(img2);
    }
    @

    [main.cpp]
    @
    #include "localimgprov.h"
    ...

    QtQuick2ApplicationViewer viewer;

    QQmlEngine* qengine = viewer.engine();
    qengine->addImageProvider(QLatin1String("localimgprov"), new localimgprov);
    @

    [*.qml]
    @
    ...
    Image{
    anchors.centerIn: parent
    //ImageProvider指定以降は、画像ファイルをProject配下からのフルパスで指定
    source: "image://localimgprov/://image/image32bit.png"
    }
    @



  • 報告、参考になります。

    こういう利用法の場合、QPixmapCache::setCacheLimit() で Qt のキャッシュサイズを小さめに設定しておいたほうが良いかもしれません。デフォルトは 10MB になっているはずです。
    http://qt-project.org/doc/qt-5/qpixmapcache.html

    もっと減らしたい場合にはあまり効果は望めませんが。


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.