当前位置: 首页 > news >正文

QPixmap::scaled参数说明

QPixmap::scaled参数说明

QPixmap QPixmap::scaled(const QSize &size, Qt::AspectRatioMode aspectRatioMode = Qt::IgnoreAspectRatio, Qt::TransformationMode transformMode = Qt::FastTransformation) const

官方文档给出参数解释

If aspectRatioMode is Qt::IgnoreAspectRatio, the pixmap is scaled to size.
If aspectRatioMode is Qt::KeepAspectRatio, the pixmap is scaled to a rectangle as large as possible inside size, preserving the aspect ratio.
If aspectRatioMode is Qt::KeepAspectRatioByExpanding, the pixmap is scaled to a rectangle as small as possible outside size, preserving the aspect ratio.

对于aspectRatioMode

我们用图解和更具体的例子来解释 QPixmap::scaled() 函数中 aspectRatioMode 参数的三种模式。假设你有一张原始尺寸为 200x100 (宽x高) 的图片(宽:高 比例是 2:1),你想把它缩放到一个 150x150 的正方形区域 (size)。

原始图片 (200x100):

+-------------------------+
|      (宽 200)           |
|                         | (高 100)
|                         |
+-------------------------+

目标区域 (150x150):

+---------------+
|               |
|               |
|               | (150)
|               |
|               |
+---------------+(150)

现在看三种模式的效果:

  1. Qt::IgnoreAspectRatio (忽略宽高比)

    • 行为: 无论原始图片的宽高比是多少,都强制把它拉伸或压缩到你指定的确切尺寸 (150x150)。
    • 结果尺寸: 150x150
    • 视觉效果: 图片会被变形。因为原始是 2:1 的宽图,现在被硬塞进 1:1 的正方形,所以它会被垂直拉伸。
    +---------------+
    |               |
    |               |
    |     变形       |  <- 图片被垂直拉伸填满整个 150x150 区域
    |               |
    |               |
    +---------------+(150 x 150)
    
  2. Qt::KeepAspectRatio (保持宽高比)

    • 行为: 缩放图片,使其尽可能大,但必须完整地放入目标区域 (150x150) 内,同时保持原始图片的宽高比不变。
    • 计算:
      • 水平方向最大可以放大/缩小到 150 宽。
      • 垂直方向最大可以放大/缩小到 150 高。
      • 为了保持 2:1 的宽高比:
        • 如果宽是 150,那么高应该是 150 / 2 = 75。
        • 如果高是 150,那么宽应该是 150 * 2 = 300。
      • 300 超过了 150 的宽度限制,不行。75 在 150 的高度限制内,可以。
      • 所以最终尺寸是 150 (宽) x 75 (高)。
    • 结果尺寸: 150x75
    • 视觉效果: 图片不变形,完整显示,但会在目标区域内留下空白(上下各 37.5 像素的空白)。
    +---------------+
    |               |  <- 空白 (37.5px)
    +===============+ ---
    |               |  |
    |               |  |
    |  不变形,完整显示 |  | 75px
    |               |  |
    |               |  |
    +===============+ ---
    |               |  <- 空白 (37.5px)
    +---------------+(150 px)
    
  3. Qt::KeepAspectRatioByExpanding (通过扩展保持宽高比)

    • 行为: 缩放图片,使其尽可能小,但必须完整地覆盖目标区域 (150x150),同时保持原始图片的宽高比不变。这意味着图片的某些部分可能会超出目标区域,需要裁剪。
    • 计算:
      • 水平方向至少需要 150 宽才能覆盖。
      • 垂直方向至少需要 150 高才能覆盖。
      • 为了保持 2:1 的宽高比:
        • 如果宽是 150,那么高应该是 150 / 2 = 75。这不足以覆盖 150 高。
        • 如果高是 150,那么宽应该是 150 * 2 = 300。这足以覆盖 150 宽。
      • 为了满足“覆盖”的要求,我们必须让高度达到 150,因此宽度会变成 300。
      • 所以最终尺寸是 300 (宽) x 150 (高)。
    • 结果尺寸: 300x150
    • 视觉效果: 图片不变形,完全覆盖了目标区域的高,但宽度超出了目标区域。你需要只显示中间 150x150 的部分,相当于裁剪掉了左右各 75px。
    |<- 75px ->|<- 显示的 150px ->|<- 75px ->|
    +----------+-------------------+----------+ ---
    |          |                   |          |  |
    |   裁剪    |                   |   裁剪    |  |
    |   掉的    |   不变形,完全覆盖  |   掉的    |  | 150px
    |   部分    |                   |   部分    |  |
    |          |                   |          |  |
    +----------+-------------------+----------+ ---
    (总宽 300px, 但只显示中间 150px)
    

核心区别总结:

  • IgnoreAspectRatio: 强制缩放到指定大小,不管变形。
  • KeepAspectRatio: 完整显示图片,保持比例,但可能留有空白
  • KeepAspectRatioByExpanding: 完全覆盖指定区域,保持比例,但可能需要裁剪

对于transformMode

ConstantValueDescription
Qt::FastTransformation0The transformation is performed quickly, with no smoothing.
Qt::SmoothTransformation1The resulting image is transformed using bilinear filtering.

核心区别总结:

  • 如果你需要最快的缩放速度,并且可以接受较低的图像质量,请选择 Qt::FastTransformation
  • 如果你希望缩放后的图像看起来更平滑、质量更好,并且可以接受稍微慢一点的速度,请选择 Qt::SmoothTransformation。在大多数用户界面应用中,推荐使用 Qt::SmoothTransformation
http://www.dtcms.com/a/295042.html

相关文章:

  • 床上肢体康复机器人的机械结构设计cad【7张】三维图+设计说明书
  • 1、黑马点评复盘(短信登录-Session或Redis实现)
  • pytest简单使用和生成测试报告
  • FCW(Front Collision Warning)前碰撞预警功能介绍
  • 借助DataStream和多路复用实现可观察性
  • mybatis条件语句的查询与注解的使用以及mybatis与servelet结合查询
  • 数据结构系列之AVL树
  • 主要科技公司与新创公司 AI Agent 进展调研
  • Nginx 日志分析与慢请求排查
  • Symantec sep配置自定义yara规则
  • 背包九讲 详细解析与 C++ 实现
  • 不一样的Mysql安装方式
  • (8)Step 7 实现泵组主备切换与PID变频调节(压力——频率)
  • LangChain面试内容整理-知识点28:LangChain部署实践
  • 【JavaSE】正则表达式学习笔记
  • 二、计算机网络技术——第4章:网络层
  • 跟著Qcadoo MES系统学习产品设计001
  • 从订单簿到AMM:一场去中心化交易所的技术革命
  • 彻底掌握双列集合——Map接口以及实现类和常用API及其底层原理
  • 1688商品数据采集的应用行业与接入方式
  • 人工智能之数学基础:事件间的运算
  • JVM、Dalvik、ART垃圾回收机制
  • OpenLayers 快速入门(八)事件系统
  • java基础(the 15th day)
  • freelancer是什么用工模式?有什么好处和坏处呢?
  • Log4j2漏洞vul-hub通关教程
  • 根据图片的r值来进行透明剔除
  • SpringBoot RESTful API设计指南
  • C++day1
  • #Linux内存管理# 在一个播放系统中同时打开几十个不同的高清视频文件,发现播放有些卡顿,打开视频文件是用mmap函数,请简单分析原因。