Qt 中大尺寸图片的处理
我们的程序(用 Qt 实现),因为一个用户图标,在发到用户的产品中崩溃了。
起因是这样的,我们允许用户注册上传自己的头像。然后中售卖的设备屏幕界面上,也会展示用户自己的头像。
有一个用户上传了一个超大的头像图片,6144 x 6144 像素,jpg 的图片有 1.8M。然后他的设备的UI界面就经常卡死、崩溃。
计算一下,假如图片每个像素 rgb 3 字节,那么 6144 * 6144 * 3 为 108M,对于 1个嵌入式平台,108 M已经很大了,申请这么大的内存很容易失败,那么程序崩溃就不足为奇了。
虽然这个问题应该在输入端(即用户上传头像时)解决,但是展示端都应该自我保护,无论如何,不能够崩溃。
下面看看 Qt/Qml 中怎么处理这种大尺寸图片。
缩小展示
对于这种大尺寸图片,可以改变输出图片的尺寸,将图片缩小展示。
QImageReader
中 Qt 中,除了直接用 QImage 加载图片,还有 QImageReader 这个更底层的 API。
QImageReader reader(file);
QImage image = reader.read();
对于大尺寸图片,使用 QImageReader 可以设置输出图片的尺寸。根据实际需要展示的尺寸,来配置 QImageReader。
QImageReader reader(file);
reader.setScaledSize({60, 60});
QImage image = reader.read();
这样不管输入图片的尺寸是多少,输出图片最大只有 60 x 60 ,内存使用就很少了。
那么是否可以用 QImage::scaled 方法呢?像下面这样:
QImage image(file);
image = image.scaled({60, 60});
不行的,因为应该中间图片尺寸任然很大, 还是有可能内存不足。
实际上,QImageReader 是直接用目标尺寸来解压缩图片(比如 jpg 格式),与 QImage 的 scaled 方法无关。
Image(QML)
在 Qml 中,并不能直接使用 QImageReader,而是使用 Image 控件。能不能处理大尺寸图片呢?
答案是肯定的,Image 有一个 sourceSize 属性,与 setScaledSize 是一样的。
Image
{source: "1.jpg"sourceSize: Qt.size(60, 60)
}
或者:
Image
{source: "1.jpg"sourceSize.width: 60sourceSize.height: 60
}
局部展示
除了缩小展示图片,还可以不缩小图片,而是拖动图片以浏览各个区域。比如浏览一张大的全景照片,想要看到拍摄的局部细节。
当然,内存的限制仍然存在。
中 Qt 中,针对这种需求,也提供的相关的机制。
QImageReader
除了 scaledSize,QImageReader 还支持 clipRect、scaledClipRect。这里我们不需要 scale,直接用 setClipRect、用 setScaledClipRect 也是一样的。根据屏幕的展示尺寸来配置。
QImageReader reader(file);
reader.setClipRect({0, 0, 1280, 720});
QImage image = reader.read();
上面只展示大图片的左上角 1280 x 720 的大小。当用户拖动图片时,调整 clipRect 的 left、top 重新 read 即可。
Image(QML)
在 Qml 的 Image 中,也有相应的 sourceClipRect 属性。
Image {source: "1.svg"sourceSize.width: 1024sourceSize.height: 1024sourceClipRect: Qt.rect(100, 100, 512, 512)
}
以上只是基础性介绍,实际使用中要考虑提高效率,不要因为只拖动了一点点,就要重新加载整个屏幕的图片。具体的方法要等以后遇到相关需求,研究后再来介绍。
Qt 中大尺寸图片的处理相关推荐
- QT设置背景图片以及设置按钮
1.Qt设置背景图片 ①.设置UI窗口背景图片,需要在构造函数中添加以下代码: this-> setAutoFillBackground(true); QPa ...
- VS+Qt应用开发-Qt+Halcon显示图片,实现鼠标缩放、移动图片
VS+Qt应用开发-Qt+Halcon显示图片,实现鼠标缩放.移动图片 效果展示 界面设计 代码例程 完整代码 CMyLabel.h CMyLabel.cpp BrowsePic.h BrowsePi ...
- 图片资源 php,php URL图片资源传参生成对应尺寸图片
最近项目中需要上传大图,然后不同设备请求不同大小的图片,之前有用过一个通过URL参数来获取不同大小的图片的接口感觉设计方式请不错,于是就百度看看类似是如何实现的,找了几天找个两个功能类似的记录下. 1 ...
- [css] 为什么说不提倡用1px的小尺寸图片做背景平铺?
[css] 为什么说不提倡用1px的小尺寸图片做背景平铺? 因为明明可以用background-color就能搞定的事情为什么要用图片? 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, ...
- Nginx+PHP实时生成不同尺寸图片
原来图片服务器采用Windows .net架构,鉴于需求需要生成各种尺寸图片. 流程说明: 用户从Nginx请求对应的图片,判断是否存在_200x300的对应参数,如果没有就直接请求到对应目录的原图, ...
- linux qt显示gif图片,QT显示GIF图片
在QT中要显示GIF图片,不能通过单单的添加部件来完成. 还需要手动的编写程序. 工具:QT Creator 新建一个工程,我们先在designer中,添加一个QLabel部件. 如下图: 将QLab ...
- qt无法显示图片的原因
qt无法显示图片: 原因: 1.检查图片路径,将图片路径改为全路径 如图片路径单为./jpg时,找不到图片,为全路径时可以找到 2.检查图片格式,不要乱改图片的后缀(如1.jpg改成1.png),否则 ...
- 测试数据准备之 CMD 命令:copy(指定尺寸图片1M放大成6M)
文章目录 一.前言 二.语法 三.参数说明 四.使用示例 五.特定尺寸图片大小放大 一.前言 记录一次CMD命令的学习:copy 需求场景:测试过程中,需要测试上传不同规格尺寸下且不同大小的图片,如: ...
- Qt设置背景图片方法
本文主要介绍三种Qt设置背景图片的方法: 1.QPalette 2.重写paintEvent 3.设置Qss(Qt style sheet) 1.QPalette (1)示例 //.cppthis-& ...
- WordPress彻底禁用上传媒体图片自动生成缩略图及多尺寸图片(亲测可用)
WordPress默认上传图片的时候会自动生成缩略图及多尺寸的图片文件,大部分网站都用不到这些多余的图片,不仅仅占用空间,而且上传的时候还会消耗额外的性能. 下面仅需两段函数代码即可彻底禁用该功能. ...
最新文章
- node.js(node.js+mongoose小案例)_实现简单的注册登录退出
- 面试官问:你来讲下Netty通信中的粘包、拆包?
- keepalive学习之软件设计
- 程序员的修养--读书笔记
- 使用 gitlab 进行代码管理
- SVN服务器更换地址解决方法
- 【渝粤题库】广东开放大学 外贸会计1 形成性考核
- B站、豆瓣都崩了,还有啥技术能靠得住?
- Bash(Shell)基础知识
- SWMM与Python的那些事 (一)
- 如何使用DOSBox软件编写运行汇编语言程序
- QListview获取Item内容变化信号及内容
- 需求分析(团队作业3)
- ubuntu18.04安装PCL点云库踩坑指南
- 魔众刮刮卡抽奖系统 v2.0.0 支付抽奖,更好用的刮刮卡系统
- FPGA的计数器设计
- 笛卡尔坐标为什么叫Cartesian coordinate而不是Descartes coordinate?
- Word VBA自动排版(5)- 专利具体实施方式批量增加附图标记
- 软考-嵌入式系统设计师:[网络安全:笔记(六)]
- 凯文·凯利斯坦福演讲 预言未来20年科技潮流