このページでは

C

Qt Quick ウルトラライトイメージングコーダーの例

カスタム画像フォーマットを読み込む方法を示します。

概要

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

この例では、様々な画像を表示する簡単な画面(imagedecoder.qml)を用意しました。これらの画像はQt Quick Ultralite Resource Compiler では処理されず、そのまま保存されます。2つの画像はそのままリソースシステムにコピーされ、残りの2つはファイルシステムから読み込まれます。

対象プラットフォーム

注: STM32H750B Discovery kit、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
  • ヨセミテ国立公園.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を使用する場合、コンパイラ名としてgnuCMAKE_PREFIX_PATH としてC:˶Qt6.2.4˶を使用します。

注意 : Linux では、Qt は OpenGL に依存しています。サンプルの設定中にOpenGLが見つからないというエラーが発生した場合は、次のコマンドを使用してインストールできます。

sudo apt install libgl1-mesa-dev

プロジェクトの構成

SDカード・スロットを持つプラットフォームでは、サンプルはFatFSファイル・システムAPIの実装を含み、WindowsとLinuxホスト用のデスクトップ・フォルダにはPosixの実装があります。このようなプラットフォームでは、ファイル・セレクタが適用されていない場合、ルートqmlファイルimagedecoder.qml

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

os/baremetalと os/freertosの main 関数は、ボード用に実装されなければならないConfigureBoard() 関数を呼び出します。この関数は、SDカードハードウェアのセットアップ、ファイルシステムの登録、Qt Quick Ultraliteへのイメージデコーダーの登録を行う必要があります。

これらの関数の実装は、board_config.cppのプラットフォーム名(desktop、stm、traveo_t2g)にちなんだサブフォルダーにあります。

画像のデコード

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 ライセンスの下で利用可能です。
詳細を参照してください。