Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Japanese
  4. QMLのImageでイメージデータのフォーマットを設定できますか?

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

Scheduled Pinned Locked Moved Japanese
5 Posts 2 Posters 3.9k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • K Offline
    K Offline
    kscp
    wrote on 10 Jul 2014, 11:55 last edited by
    #1

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

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

    1 Reply Last reply
    0
    • T Offline
      T Offline
      takumiasaki
      wrote on 11 Jul 2014, 09:51 last edited by
      #2

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

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

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

      1 Reply Last reply
      0
      • K Offline
        K Offline
        kscp
        wrote on 14 Jul 2014, 01:32 last edited by
        #3

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

        1 Reply Last reply
        0
        • K Offline
          K Offline
          kscp
          wrote on 8 Aug 2014, 02:56 last edited by
          #4

          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"
          }
          @

          1 Reply Last reply
          0
          • T Offline
            T Offline
            takumiasaki
            wrote on 8 Aug 2014, 04:32 last edited by
            #5

            報告、参考になります。

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

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

            1 Reply Last reply
            0

            • Login

            • Login or register to search.
            • First post
              Last post
            0
            • Categories
            • Recent
            • Tags
            • Popular
            • Users
            • Groups
            • Search
            • Get Qt Extensions
            • Unsolved