このページでは

C

Qt Quick Ultralite 画像デコーダの例

カスタム画像形式を読み込む方法を示します。

概要

この例では、カスタム画像デコーダを実装し、QMLエンジンに登録する方法を示します。

2つの画像(1つはフラッシュメモリから、もう1つはファイルシステムから読み込まれたもの)を表示するImagedecoderの例。

このサンプルは、さまざまな画像を表示するシンプルな画面(imagedecoder.qml)で構成されています。これらの画像は、Qt Quick のUltralite Resource Compilerによって処理されることなく、そのままの状態で保持されます。画像のうち2つは変更なしでリソースシステムにコピーされ、残りの2つはファイルシステムから読み込まれますが、これらについては一切宣言を行う必要がありません。

対象プラットフォーム

注: STM32H750B Discoveryキット、RH850/D1M1A評価ボード、およびInfineon のTRAVEO T2G CYT4DNには 、SDカードスロットがありません。このサンプルは、ファイルシステム上のイメージの使用を排除するように修正されています。example/imagedecoder/rootqml/+noFilesystemSupport/imagedecoder.qmlおよびexample/imagedecoder/qmlproject_stm32h750b.qmlprojectexample/imagedecoder/imagedecoder_traveo_t2g.qmlprojectを参照してください。

注: グラフィックスドライバの制限により 、現在、ソース JPEG 画像でサポートされているサブサンプリングモードは YUV420 のみです。 詳細については、『JPEG デコードドライバ TRAVEO T2G クラスタシリーズ ユーザーマニュアル』の「サンプルアプリケーションのユーザーガイド」を参照してください。ソース画像を YUV420 サブサンプリング形式に変換するには、ImageMagick Convert ツールを使用できます:convert input.jpg -sampling-factor 4:2:0 output.jpg

注: Infineon TRAVEO T2G CYT4DNの場合 、必須の CMake 変数TVII_JPEG_DRIVER_DIR を設定してください。この変数は、JPEG デコードドライバ SDK のルートフォルダを指すように設定する必要があります。

RH850プラットフォームでは、JPEGドライバを構成するために、以下のコンパイル定義を追加してください:

  • USE_OUTPUT_SPLIT_MODE

    Renesas JCUAハードウェアを、デコードがチャンク単位で行われるディビジョンモードに設定します。画像全体を一度にデコードする通常モードを使用する場合は、この定義を省略できます。

  • DECODE_BUFFER_PIXEL_LINES

    USE_OUTPUT_SPLIT_MODE が有効になっている場合、DECODE_BUFFER_PIXEL_LINES は、1回の反復処理で処理される出力バッファのピクセル行数を設定します。この値は16の倍数でなければなりません。

    DECODE_BUFFER_PIXEL_LINES のデフォルト値は16です。

  • CHROMA_SUBSAMPLING

    使用中の画像のクロマサブサンプリング形式を設定します。設定可能な値は以下の通りです:

    1. R_JCUA_JPEG_FORMAT_YCBCR420
    2. R_JCUA_JPEG_FORMAT_YCBCR411
    3. R_JCUA_JPEG_FORMAT_YCBCR422
    4. R_JCUA_JPEG_FORMAT_YCBCR444

    CHROMA_SUBSAMPLING のデフォルト値は R_JCUA_JPEG_FORMAT_YCBCR420 です。

    注:現在 、色差サブサンプリングは実行時に決定できず、コンパイル時に指定する必要があります。アプリケーションで使用されるすべてのJPEG画像は、同じ色差サブサンプリングで保存されている必要があります。

デバイスでのサンプル実行

サンプルをビルドした後、ファイルシステムから読み込まれる画像を、FAT32形式でフォーマットされたSDカードのルートフォルダにコピーする必要があります:

  • basse-terre-guadeloupe.jpg
  • yosemite-national-park.jpg

これは、STM32F769Iにのみ適用されます。このボードにはSDカードスロットが搭載されているためです。STM32プラットフォームでは、画像デコーダはJPEG画像に対してハードウェアアクセラレーション対応のデコーダを利用します。

デスクトップでのサンプル実行

デスクトップ版の実装では、Qt を使用して画像をデコードします。そのため、プロジェクトをビルドしてヘッダーファイルを提供するには、開発用の Qt が必要です。

cmake examples/imagedecoder -DCMAKE_PREFIX_PATH=$HOME/Qt/6.2.4/gcc_64 -DQUL_PLATFORM=Qt -DQul_ROOT=${QUL_ROOT}
cmake examples\imagedecoder -DCMAKE_PREFIX_PATH=C:\Qt\6.2.4\msvc2022_64 -DQUL_COMPILER_NAME=msvc -DQUL_PLATFORM=Qt -DQul_ROOT=%QUL_ROOT%

プラットフォームバックエンドがリンクされている Qt のバージョンとのリンク上の問題を回避するには、両者のバージョンを一致させる必要があります。カスタムビルドのプラットフォームの場合は、デスクトッププラットフォームバックエンドのビルドに使用したのと同じ Qt を使用してください。あらかじめビルド済みのプラットフォームライブラリの場合は、Qt 6.2.4 を使用する必要があります。

注: MinGWを使用する場合は 、コンパイラ名としてgnu を、CMAKE_PREFIX_PATH としてC:\Qt\6.2.4\mingw_64を指定してください。

注: Linuxでは 、Qt は OpenGL に依存しています。例のコンフィギュレーション中に OpenGL が見つからないというエラーが発生した場合は、次のコマンドを使用してインストールできます。

sudo apt install libgl1-mesa-dev

プロジェクト構造

SDカードスロットを備えたプラットフォームでは、このサンプルにはFatFSファイルシステムAPIの実装が含まれており、WindowsおよびLinuxホスト用のdesktopフォルダにはPosix実装が含まれています。ファイルセレクタが適用されていない場合、そのようなプラットフォーム向けのルートqmlファイルimagedecoder.qml が選択されます。

SDカードスロットのないプラットフォーム向けには、サンプルが若干変更されています。ルートQMLファイル `imagedecoder.qml ` は、`CMakeLists.txt` で `noFilesystemSupport ` セレクタを適用するか、`qmlprojectexporter` でプロジェクトをエクスポートする際に`--selector` コマンドライン引数を使用することで選択されます。

os/baremetalおよびos/freertosにあるmain 関数は、ボードごとに実装が必要なConfigureBoard() 関数を呼び出します。この関数では、SD カードのハードウェアを設定し、ファイルシステムとイメージデコーダをQt Quick Ultralite に登録する必要があります。

これらの関数の実装は、各プラットフォーム(desktop、stm、traveo_t2g)の名を冠したサブフォルダ内のboard_config.cppにあります。

画像のデコード

Qt Quick Ultraliteでは、その他の画像フォーマット用の画像デコーダを登録することが可能です。Qt Quick Ultraliteが、組み込みのアセットフォーマットではない画像を検出した場合、登録されているすべてのデコーダがチェックされ、そのうちのどれかが画像をデコードできるかどうかが確認されます。これに関する特別な構文はなく、画像ソースは通常通りフラッシュメモリまたはファイルシステムから取得できます。

Column {
    Text {
        anchors.horizontalCenter: parent.horizontalCenter
        font.pixelSize: 12
        text: " Jpeg Images from flash"
    }

    Image {
        width: 240
        height: 144
        fillMode: Image.PreserveAspectFit
        //Below images are stored as assets in flash memory
        source: leftImageToggle? "grand-canyon-arizona.jpg" : "sequoia-national-park.jpg"
    }
}

Column {
    Text {
        anchors.horizontalCenter: parent.horizontalCenter
        font.pixelSize: 12
        text: "Jpeg images from filesystem"
    }

    Image {
        width: 240
        height: 144
        fillMode: Image.PreserveAspectFit
        //Below images must be present on SD Card root folder for embedded platforms.
        source: rightImageToggle?"file://basse-terre-guadeloupe.jpg" : "file://yosemite-national-park.jpg"
    }
}

画像データをリソースとして宣言することで、変更されていない画像データをアプリケーションバイナリに組み込むことが可能です。ファイルシステムから「file://」プロトコルを使用して画像データを読み込む場合、事前に宣言する必要はありません。

ImageFiles {
    files: [
        "grand-canyon-arizona.jpg",
        "sequoia-national-park.jpg"
    ]
    MCU.resourceKeepRawData: true
}

生の画像データをリソースとして含めるには、MCU.resourceKeepRawDataプロパティを有効にする必要があります。

ファイル:

画像:

関連項目: Qul::PlatformInterface::ImageDecoder

特定の Qt ライセンスで利用可能です。
詳細はこちらをご覧ください。