C

Qt Quick Ultralite 图像解码示例

演示如何加载自定义图像格式。

概述

此示例展示了如何实现和注册一个自定义图像解码器到 QML 引擎。

该示例包含一个简单的屏幕(imagedecoder.qml),它显示了不同的图像。这些图像没有通过 Qt Quick Ultralite 资源编译器处理,而是保持原样。其中两个图像被无损地复制到资源系统中,而其他两个是从文件系统中读取,无需声明。

目标平台

注意:STM32H750B 开发套件和 Infineon TRAVEO™ T2G CYT4DN 没有SD卡槽。示例已修改以排除使用文件系统中的图像。请参阅 example/imagedecoder/rootqml/+nofilesystemsupport/imagedecoder.qmlexample/imagedecoder/qmlproject_stm32h750b.qmlprojectexample/imagedecoder/imagedecoder_traveo_t2g.qmlproject

注意:由于图形驱动程序的限制,当前仅支持的源 JPEG 图像亚抽样模式为 YUV420。有关更多信息,请参阅 JPEG 解码驱动程序 TRAVEO™ T2G 集群系列的示例应用程序用户指南。要将源图像转换为 YUV420 亚抽样格式,您可以使用 ImageMagick 转换工具:convert input.jpg -sampling-factor 4:2:0 output.jpg

注意:对于 Infineon TRAVEO™ T2G CYT4DN,请设置必需的 CMake 变量 TVII_JPEG_DRIVER_DIR。它应指向 JPEG 解码驱动程序 SDK 的根文件夹。

在设备上运行示例

在构建示例后,必须将来自文件系统的图像复制到 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\msvc_2019 -DQUL_COMPILER_NAME=msvc -DQUL_PLATFORM=Qt -DQul_ROOT=%QUL_ROOT%

为了避免与平台后端链接的Qt版本链接问题,必须是同一版本。对于自定义构建的平台,使用与构建桌面平台后端相同的Qt版本。对于预构建的平台库,必须是Qt 6.2.4。

注意:当使用MinGW时,使用gnu作为编译器名称,并使用C:\Qt\6.2.4\mingw_64作为CMAKE_PREFIX_PATH

项目结构

在具有SD卡插槽的平台上的示例包括FatFS文件系统API实现,以及Windows和Linux主机在desktop文件夹中的Posix实现。针对此类平台的根qml文件imagedecoder.qml通过在CMakeLists.txt中应用filesystemSupport选择器来选择。

对于没有SD卡插槽的平台,示例略有修改。根qml文件imagedecoder.qml通过在CMakeLists.txt中应用noFilesystemSupport选择器来选择。

os/baremetalos/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许可证的许可下可用。
了解更多信息。