qml Image 内存问题

文章探讨了在QML项目中,Image组件导致内存占用过大的问题。通过实例展示了大图作为背景时,即使图片文件小,加载后也会占用大量内存。解决方案是使用sourceSize属性限制内存中的图像大小,以降低内存使用,但可能牺牲部分图像质量。此外,对于大图处理,可以考虑设置cache为false以防止过度缓存影响其他资源。
摘要由CSDN通过智能技术生成

背景

笔者在项目中,有一个历史记录的功能,历史记录是类似一个相册的功能,当进入次功能的时候发现内存占用特别大,所以研究下 Image

在 qml 中,Image 作为最常用的控件之一,简单又方便。然而,程序中大量使用 Image 后,我发现有些不对劲。

例如,我使用一张高清的大图作为背景(2000 x 2000 background.jpg):

import QtQuick 2.12
import QtQuick.Window 2.12
 
Window {
    id: root
    visible: true
    width: 1024
    height: 680
 
    Image {
        anchors.fill: parent
        source: "background.jpg"
    }
}

因为是JPG,它的压缩率很高,因此只占用 400KB 的空间。运行起来发现,内存占用 40MB (左右),看起来似乎可以接受。然而,接着多添加几张图片试试:

import QtQuick 2.12
import QtQuick.Window 2.12
 
Window {
    id: root
    visible: true
    width: 1024
    height: 680
 
    Image {
        anchors.fill: parent
        source: "background.jpg"
    }
    Image {
        anchors.fill: parent
        source: "background2.jpg"
    }
    Image {
        anchors.fill: parent
        source: "background3.jpg"
    }
}

结果每多一张就增加 20MB,现在占用 80MB 内存了!这已经完全不能接受了好吗,虽然不可能每张图片都是 2000 x 2000,但也架不住图片多啊(ಥ _ ಥ)。

于是我开始在文档中寻找答案 > > >最终,我找到了,那就是 sourceSize: size,此属性保存已加载图像的实际宽度和高度。

与缩放图像绘制的宽度和高度属性不同,此属性设置为加载的图像存储的实际像素数,以便大图像不会占用超过必要的内存。也就是说,该属性可以限制实际内存中图像的的大小。

现在来试一下效果:

import QtQuick 2.12
import QtQuick.Window 2.12
 
Window {
    id: root
    visible: true
    width: 1024
    height: 680
 
    Image {
        anchors.fill: parent
        source: "background.jpg"
        sourceSize: Qt.size(1024, 680)
    }
}

现在内存降到了 20MB。
这样做的优点显而易见,那么缺点就是:
在窗口 <= size(1024, 680) (初始大小)的时候,不会有任何区别,而在 > size(1024, 680) 时,会变模糊。
具体原因是:放大失真后进行了平滑处理 ( 来源于 smooth 属性,默认 true,因此设为 false 将会出现明显锯齿 )。
因此,我的建议是:将 sourceSize 设为一个合理的大小(并且最好稍微大一点)。

解决方案

设置了 sourceSize

结语

最后,讲一些题外话:
Image 有一个属性 cache:

Specifies whether the image should be cached. The default value is
true.

Setting cache to false is useful when dealing with large images, to
make sure that they aren’t cached at the expense of small ‘ui element’
images.

翻译:
指定是否应缓存图像。 默认值是true。

在处理大图像时,将缓存设置为false非常有用,以确保它们不会以小的“ui元素”图像为代价进行缓存。
当用一系列图片来做动画时,记得cache 设置成false,不然内存会消耗的非常大

要在QMLImage中设置圆角,可以使用OpacityMask来实现。首先,创建一个Rectangle作为遮罩,设置其radius属性为所需的圆角大小。然后,使用OpacityMask将遮罩应用到Image上。下面是一个示例代码: ```qml import QtQuick 2.12 import QtQuick.Window 2.12 import QtGraphicalEffects 1.13 Window { visible: true width: 640 height: 480 title: qsTr("Hello World") Image { id: normalImage width: 150 height: 150 anchors.left: parent.left anchors.leftMargin: 100 anchors.top: parent.top anchors.topMargin: 100 source: "qrc:/header.jpg" } MouseArea { id: imageRect width: 150 height: 150 anchors.top: parent.top anchors.topMargin: 100 anchors.right: parent.right anchors.rightMargin: 100 // 头像 Image { id: nameIamge anchors.fill: parent source: "qrc:/header.jpg" visible: false onStatusChanged: { if(nameIamge.status === Image.Error){ console.log("load error==============") } } } Rectangle { id: mask anchors.fill: parent radius: 10 visible: false } OpacityMask { anchors.fill: parent source: nameIamge maskSource: mask } } } ``` 在上述代码中,我们创建了一个Image来显示原始图像,并使用一个MouseArea来触发显示圆角的图像。在MouseArea中,我们使用了一个Rectangle作为遮罩,设置了其radius属性为10,以实现圆角效果。然后,使用OpacityMask将遮罩应用到Image上,从而达到显示圆角图像的效果。 希望对你有所帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [qml Image显示圆角图像](https://blog.csdn.net/chenyijun/article/details/119772045)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [qml Image绘制圆角(图片绘制圆角)](https://blog.csdn.net/qq_43081702/article/details/125104269)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [QML Image获取资源路径的细节](https://download.csdn.net/download/weixin_38670949/12783402)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值