我们的程序(用 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 中大尺寸图片的处理相关推荐

  1. QT设置背景图片以及设置按钮

    1.Qt设置背景图片 ①.设置UI窗口背景图片,需要在构造函数中添加以下代码:          this-> setAutoFillBackground(true);          QPa ...

  2. VS+Qt应用开发-Qt+Halcon显示图片,实现鼠标缩放、移动图片

    VS+Qt应用开发-Qt+Halcon显示图片,实现鼠标缩放.移动图片 效果展示 界面设计 代码例程 完整代码 CMyLabel.h CMyLabel.cpp BrowsePic.h BrowsePi ...

  3. 图片资源 php,php URL图片资源传参生成对应尺寸图片

    最近项目中需要上传大图,然后不同设备请求不同大小的图片,之前有用过一个通过URL参数来获取不同大小的图片的接口感觉设计方式请不错,于是就百度看看类似是如何实现的,找了几天找个两个功能类似的记录下. 1 ...

  4. [css] 为什么说不提倡用1px的小尺寸图片做背景平铺?

    [css] 为什么说不提倡用1px的小尺寸图片做背景平铺? 因为明明可以用background-color就能搞定的事情为什么要用图片? 个人简介 我是歌谣,欢迎和大家一起交流前后端知识.放弃很容易, ...

  5. Nginx+PHP实时生成不同尺寸图片

    原来图片服务器采用Windows .net架构,鉴于需求需要生成各种尺寸图片. 流程说明: 用户从Nginx请求对应的图片,判断是否存在_200x300的对应参数,如果没有就直接请求到对应目录的原图, ...

  6. linux qt显示gif图片,QT显示GIF图片

    在QT中要显示GIF图片,不能通过单单的添加部件来完成. 还需要手动的编写程序. 工具:QT Creator 新建一个工程,我们先在designer中,添加一个QLabel部件. 如下图: 将QLab ...

  7. qt无法显示图片的原因

    qt无法显示图片: 原因: 1.检查图片路径,将图片路径改为全路径 如图片路径单为./jpg时,找不到图片,为全路径时可以找到 2.检查图片格式,不要乱改图片的后缀(如1.jpg改成1.png),否则 ...

  8. 测试数据准备之 CMD 命令:copy(指定尺寸图片1M放大成6M)

    文章目录 一.前言 二.语法 三.参数说明 四.使用示例 五.特定尺寸图片大小放大 一.前言 记录一次CMD命令的学习:copy 需求场景:测试过程中,需要测试上传不同规格尺寸下且不同大小的图片,如: ...

  9. Qt设置背景图片方法

    本文主要介绍三种Qt设置背景图片的方法: 1.QPalette 2.重写paintEvent 3.设置Qss(Qt style sheet) 1.QPalette (1)示例 //.cppthis-& ...

  10. WordPress彻底禁用上传媒体图片自动生成缩略图及多尺寸图片(亲测可用)

    WordPress默认上传图片的时候会自动生成缩略图及多尺寸的图片文件,大部分网站都用不到这些多余的图片,不仅仅占用空间,而且上传的时候还会消耗额外的性能. 下面仅需两段函数代码即可彻底禁用该功能. ...

最新文章

  1. node.js(node.js+mongoose小案例)_实现简单的注册登录退出
  2. 面试官问:你来讲下Netty通信中的粘包、拆包?
  3. keepalive学习之软件设计
  4. 程序员的修养--读书笔记
  5. 使用 gitlab 进行代码管理
  6. SVN服务器更换地址解决方法
  7. 【渝粤题库】广东开放大学 外贸会计1 形成性考核
  8. B站、豆瓣都崩了,还有啥技术能靠得住?
  9. Bash(Shell)基础知识
  10. SWMM与Python的那些事 (一)
  11. 如何使用DOSBox软件编写运行汇编语言程序
  12. QListview获取Item内容变化信号及内容
  13. 需求分析(团队作业3)
  14. ubuntu18.04安装PCL点云库踩坑指南
  15. 魔众刮刮卡抽奖系统 v2.0.0 支付抽奖,更好用的刮刮卡系统
  16. FPGA的计数器设计
  17. 笛卡尔坐标为什么叫Cartesian coordinate而不是Descartes coordinate?
  18. Word VBA自动排版(5)- 专利具体实施方式批量增加附图标记
  19. 软考-嵌入式系统设计师:[网络安全:笔记(六)]
  20. 凯文·凯利斯坦福演讲 预言未来20年科技潮流

热门文章

  1. 吴式太极大师战波简介
  2. 浏览器被hao123劫持首页处理
  3. ca 手机抓包_抓包安卓7以上ca证书安装方法
  4. 前端轻松破解支付宝AR抢红包
  5. 科学巨星的美丽轨迹——走近博弈论大师纳什
  6. CodeVs 3315 时空跳跃者的魔法(最终版本)
  7. 通信协议:分辨率和偏移量的使用
  8. 计网笔记-计网总结-计网复习提纲-第一章.概述
  9. java最早的游戏_回忆S60(塞班)年代的JAVA游戏
  10. 在线qq的html代码,网页QQ