图片 QML 类型

显示图片。 更多...

导入声明import QtQuick
继承

Item

继承自

AnimatedImage

属性

详细描述

Image 类型显示图片。

图片源是通过 source 属性指定的 URL。图片可以是 Qt 支持的任何标准图像格式,包括位图格式,例如 PNG 和 JPEG,以及矢量图形格式,例如 SVG。如果需要显示动画图片,请使用 AnimatedSpriteAnimatedImage

如果没有指定 widthheight 属性,Image 会自动使用加载的图片大小。默认情况下,指定项的宽度和高度会将图片缩放到该大小。可以通过设置 fillMode 属性来改变这种行为,允许图片被拉伸和平铺。

示例用法

以下示例显示了 Image 类型的最简单用法。

import QtQuick

Image {
    source: "pics/qtlogo.png"
}


压缩纹理文件

当运行时底层图形API支持时,图像也可以以压缩纹理文件的形式提供。内容必须是简单的RGB(A)格式二维纹理。支持的压缩方案仅受底层驱动程序和GPU的限制。以下容器文件格式受支持:

  • PKM(自Qt 5.10起)
  • KTX(自Qt 5.11起)
  • ASTC(自Qt 5.13起)

注意:纹理文件中图像的预期垂直方向通常并没有很好地定义。不同的纹理压缩工具有不同的默认值和选项,决定何时翻转输入图像。如果纹理文件中的图像出现 upside down,可能需要在资产管理过程中翻转。或者,可以通過应用通过变换属性应用的适当转换,或者更方便地,通过设置 mirrorVertically 属性来翻转 Image 元素。

transform: [ Translate { y: -myImage.height }, Scale { yScale: -1 } ]

或者

mirrorVertically: true

注意:半透明原始图像在纹理压缩之前需要进行alpha预乘,以便在Qt Quick中正确显示。这可以通过以下ImageMagick命令行完成:

convert foo.png \( +clone -alpha Extract \) -channel RGB -compose Multiply -composite foo_pm.png

不要混淆容器格式(例如,KTX)和容器文件中存储的实际纹理数据格式。例如,所有平台上都支持在运行时读取KTX文件,不受运行时使用的GPU驱动程序的限制。但这并不能保证文件中的数据使用的压缩纹理格式在运行时受支持。例如,如果KTX文件包含使用ETC2 RGBA8格式的压缩数据,而运行时使用的3D图形API实现不支持ETC2压缩纹理,则Image项将不会显示任何内容。

注意:压缩纹理格式不受Qt控制,确保为相应的目标环境提供适当的压缩纹理数据格式是应用程序或设备开发人员的责任。

不要假设压缩格式支持是特定于平台的。它也可能与该平台上使用的驱动程序和3D API实现相关。实际上,同一平台上不同3D图形API(如Vulkan和OpenGL)的实现(如为相同硬件的同一个供应商的Windows)可能提供不同的压缩纹理格式集。

仅当针对桌面环境(Windows、macOS、Linux)时,一般建议考虑使用DXTn/BCn格式,因为这些格式在Direct 3D、Vulkan、OpenGL和Metal在平台上的实现中获得广泛支持。相比之下,当针对移动或嵌入式设备时,ETC2ASTC格式可能是更好的选择,因为这些通常是OpenGL ES在此类硬件上支持的格式。

旨在在桌面、移动和嵌入式硬件上运行的应用程序应仔细规划和设计其压缩纹理的使用。依靠单一格式很可能是不够的,因此该应用程序很可能需要根据平台分支以在该平台适当地使用压缩纹理格式,或者在某些情况下可能需要跳过使用压缩纹理。

自动检测文件扩展名

如果source URL指示一个不存在的本地文件或资源,Image元素将尝试自动检测文件扩展名。如果可以找到现有文件,可以通过将任何受支持的图像文件扩展名附加到source URL来找到该文件。

文件搜索尝试首先查找压缩纹理容器文件的扩展名。如果搜索失败,它将尝试使用常规图像文件类型的扩展名进行搜索。例如

// Assuming the "pics" directory contains the following files:
//   dog.jpg
//   cat.png
//   cat.pkm

Image {
    source: "pics/cat.png"     // loads cat.png
}

Image {
    source: "pics/dog"         // loads dog.jpg
}

Image {
    source: "pics/cat"         // normally loads cat.pkm, but if no OpenGL, loads cat.png instead.
}

此功能便于在不同目标平台上部署不同的图像资产文件类型。这有助于调整应用程序性能和适应不同的图形硬件。

此功能是在Qt 5.11版本中引入的。

性能

默认情况下,本地可用的图像会立即加载,并且用户界面会在加载完成前被阻塞。如果需要加载大图像,可以通过启用异步属性,在低优先级线程中加载图像。

如果图像是从网络而不是本地资源获得的,它将自动以异步方式加载,并且会根据情况更新进度状态属性。

图像会在内部缓存和共享,因此如果几个Image项有相同的,则只会加载一个图像的副本。

注意:图像通常是QML用户界面中消耗内存最多的部分。建议通过sourceSize属性限制不构成用户界面的图像的大小。这对于从外部源加载的内容或由用户提供的属性尤为重要。

另请参阅Qt Quick 示例 - 图像元素QQuickImageProviderQImageReader::setAutoDetectImageFormat

属性文档

paintedHeight : real [只读]

paintedWidth : real [只读]

这些属性保存实际绘制的图像大小。在大多数情况下,它与widthheight相同,但使用Image.PreserveAspectFitImage.PreserveAspectCrop时,paintedWidthpaintedHeight可以比Image项的widthheight小或大。


horizontalAlignment : 枚举

verticalAlignment : 枚举

设置图像的水平垂直对齐方式。默认情况下,图像是居中对齐的。

horizontalAlignment的有效值是Image.AlignLeftImage.AlignRightImage.AlignHCenter。有效值是verticalAlignmentImage.AlignTopImage.AlignBottomImage.AlignVCenter


currentFrame : int

frameCount : int [只读]

currentFrame是当前可见的帧。默认是0。您可以将其设置为介于0frameCount - 1之间的数字,以显示具有多个帧的图像的不同帧。

frameCount 是图像中的帧数。大多数图像只有一帧。


异步 : 布尔值

指定本地文件系统上的图像应在单独的线程中异步加载。默认值为 false,导致在加载图像时阻塞用户界面线程。将 异步 设置为 true 要比立即显示图像更有利于保持用户界面的响应性。

请注意,此属性仅适用于从本地文件系统读取的图像。通过网络资源(例如 HTTP)加载的图像始终异步加载。


autoTransform : 布尔值

该属性表示图像是否应自动应用图像变换元数据,例如 EXIF 方向。

默认情况下,此属性设置为 false。


cache : 布尔值

指定是否应缓存图像。默认值为 true。当处理大图像时,将 cache 设置为 false 是有用的,以确保不会牺牲小的“UI 元素”图像来缓存它们。


fillMode : 枚举类型

将此属性设置为定义当源图像的大小与项不同时会发生什么。

常数描述
Image.Stretch图像缩放以适应
Image.PreserveAspectFit图像均匀缩放以适应而不裁剪
Image.PreserveAspectCrop图像均匀缩放以填充,必要时裁剪
Image.Tile图像在水平和垂直方向上重复
Image.TileVertically图像在水平方向上拉伸并在垂直方向上铺贴
Image.TileHorizontally图像在垂直方向上拉伸并在水平方向上铺贴
Image.Pad图像未进行变换

拉伸(默认值)
Image {
    width: 130; height: 100
    source: "qtlogo.png"
}

PreserveAspectFit
Image {
    width: 130; height: 100
    fillMode: Image.PreserveAspectFit
    source: "qtlogo.png"
}

PreserveAspectCrop
Image {
    width: 130; height: 100
    fillMode: Image.PreserveAspectCrop
    source: "qtlogo.png"
    clip: true
}

Tile
Image {
    width: 120; height: 120
    fillMode: Image.Tile
    horizontalAlignment: Image.AlignLeft
    verticalAlignment: Image.AlignTop
    source: "qtlogo.png"
}

TileVertically
Image {
    width: 120; height: 120
    fillMode: Image.TileVertically
    verticalAlignment: Image.AlignTop
    source: "qtlogo.png"
}

TileHorizontally
Image {
    width: 120; height: 120
    fillMode: Image.TileHorizontally
    verticalAlignment: Image.AlignLeft
    source: "qtlogo.png"
}

请注意,clip 默认为 false,这意味着即使将 fillMode 设置为 PreserveAspectCrop,项也可能在边界矩形外绘制。

另请参阅 Qt Quick 示例 - 图像元素.


mipmap : 布尔值

该属性表示在缩放或变换图像时是否使用 mipmap 过滤。

Mipmap 过滤在缩放时比平滑提供了更好的视觉效果,但可能会带来性能成本(在初始化图像和渲染期间)。

默认情况下,此属性设置为 false。

另请参阅 smooth.


mirror : 布尔值

该属性表示图像是否应水平反转(实际上是显示镜像图像)。

默认值为 false。


mirrorVertically : 布尔值 [since 6.2]

该属性表示图像是否应垂直反转(实际上是显示镜像图像)。

默认值为 false。

此属性在 Qt 6.2 中引入。


progress : 实数 [只读]

该属性表示图像加载的进度,从 0.0(未加载任何内容)到 1.0(完成)。

另请参阅 status.


smooth : 布尔值

该属性表示当图像缩放或变换时是否进行平滑过滤。平滑过滤可以提供更好的视觉质量,但在某些硬件上可能会变慢。如果图像以自然大小显示,则此属性对视觉效果或性能没有影响。

默认情况下,此属性设置为true。

另请参阅mipmap


source : url

图像可以处理Qt支持的任何图像格式,无论是从任何Qt支持的URL方案加载。

URL可以是绝对路径,也可以是相对于组件的路径。

另请参阅QQuickImageProvider压缩纹理文件自动检测文件扩展名


sourceClipRect : rect

如果设置此属性,则表示要加载的源图像的矩形区域。

sourceClipRectsourceSize 属性协同工作,以便在只需要加载图像的一部分时节省系统资源。

Rectangle {
    width: ...
    height: ...

    Image {
       anchors.fill: parent
       source: "reallyBigImage.svg"
       sourceSize.width: 1024
       sourceSize.height: 1024
       sourceClipRect: Qt.rect(100, 100, 512, 512)
    }
}

在上面的示例中,首先将SVG图形按1024x1024的比例缩放,然后从顶部和左侧边缘100像素的位置切割出512x512像素的感兴趣区域。因此,sourceSize 决定了缩放比例,但实际的输出图像是512x512像素。

某些图像格式可以通过仅渲染指定的区域来节省CPU时间。其他格式需要先加载整个图像,然后再将其剪切到指定的区域。

可以通过将 sourceClipRect 设置为 undefined 来清除此属性,以便重新加载整个图像。

注意:动态更改此属性会引起图像源重新加载,如果它不在磁盘缓存中,可能甚至是从网络上重新加载。

注意:不支持子像素裁剪:给定的矩形将传递给QImageReader::setScaledClipRect()。


sourceSize : size

此属性包含图像帧的缩放后的宽度和高度。

宽度高度 属性不同,它们缩放图像的绘制,该属性设置存储加载图像的像素数目的最大值,以防止大图像占用超过必要的内存。例如,这确保内存中的图像不大于1024x1024像素,而不管图像的 宽度高度 值。

Rectangle {
    width: ...
    height: ...

    Image {
       anchors.fill: parent
       source: "reallyBigImage.jpg"
       sourceSize.width: 1024
       sourceSize.height: 1024
    }
}

如果图像的实际大小大于 sourceSize,则图像会缩小。如果只设置大小的其中一个维度大于0,则另一个维度按比例设置以保留源图像的宽高比。(这 fillMode 不受影响。)

如果设置 sourceSize.widthsourceSize.height,则图像将缩小以适应指定的尺寸(除非使用 PreserveAspectCropPreserveAspectFit,然后它会按 cropping/fitting 的最佳尺寸缩放),保持图像的宽高比。缩放后图像的实际大小可通过 Item::implicitWidthItem::implicitHeight 获取。

如果源是一个本质上可缩放的图像(例如SVG),此属性确定加载的图像的大小,而不考虑内在大小。请避免动态更改此属性;与图像相比,渲染SVG要慢得多。

如果源是一个非可缩放图像(例如JPEG),加载的图像将不会超过此属性指定的尺寸。对于某些格式(目前仅为JPEG),整个图像实际上永远不会被完全加载到内存中。

如果还将sourceClipRect属性设置为,则sourceSize确定缩放级别,但它将被剪裁到剪辑矩形的大小。

可以通过将sourceSize设置为undefined将其清除到图像的原始大小。

注意:动态更改此属性会引起图像源重新加载,如果它不在磁盘缓存中,可能甚至是从网络上重新加载。

另请参阅 Qt Quick 示例 - 指针处理器


状态 : 枚举 [只读]

此属性持有图像加载的状态。它可以是以下之一

常数描述
Image.Null尚未设置图像
Image.Ready已加载图像
Image.Loading目前正在加载数据库
Image.Error加载图像时出现错误

请使用此状态提供更新或以某种方式响应状态更改。例如,您可以选择

  • 触发状态更改
    State { name: 'loaded'; when: image.status == Image.Ready }
  • 实现一个onStatusChanged信号处理器
    Image {
        id: image
        onStatusChanged: if (image.status == Image.Ready) console.log('Loaded')
    }
  • 绑定到状态值
    Text { text: image.status == Image.Ready ? 'Loaded' : 'Not loaded' }

另请参阅 progress


© 2024 The Qt Company Ltd。本文件中所包含的文档贡献是其各自所有者的版权。提供的文档是在自由软件基金会发布的GNU 自由文档许可证版本 1.3条款下许可的。Qt及其相关商标是芬兰和/或世界其他国家的The Qt Company Ltd.的商标。所有其他商标是其各自所有者的财产。