You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让图片水印字体大小适配图像分辨率(Qt/C++场景)

解决Qt中水印字体适配图像分辨率的问题

要让水印字体适配不同分辨率的图像,核心是根据图像尺寸动态计算字体大小,而非使用固定值。这里提供两种实用的实现方式:

方法一:基于图像短边百分比设置字号

取图像宽高中的较小值,乘以一个可调整的比例(比如2%),确保横竖屏图像的水印视觉大小一致。

修改后的代码如下:

QObject::connect(ui->pushButton_3, &QPushButton::clicked, this, [&](){
    QString fileName{"D:/images/IMG_20201231_004236.jpg"};
    QFileInfo fInfo{fileName};
    auto dateTime = fInfo.metadataChangeTime().toString("dd/MM/yyyy h:m");

    QImage newImage{fileName};
    if(newImage.isNull()){
      qInfo() << "Error!!";
      return;
    }

    QPainter painter{&newImage};
    painter.setOpacity(0.5);
    painter.setPen(Qt::white);
    painter.setBrush(Qt::SolidPattern);

    // 动态计算字体大小:取图像短边的2%作为字号
    int imageShortSide = qMin(newImage.width(), newImage.height());
    int fontSize = qRound(imageShortSide * 0.02); // 比例可按需调整,比如0.03对应更大的水印
    painter.setFont(QFont("Arial", fontSize));

    painter.drawText(newImage.rect(), Qt::AlignBottom | Qt::AlignRight, dateTime);
    painter.end();
    newImage.save("D:/newImage.jpg");
    qInfo() << "saved image!!!" << '\n';
});

关键细节:

  • qMin(newImage.width(), newImage.height()):获取图像短边,避免横竖屏场景下字号失衡
  • qRound():将浮点计算结果转为整数(Qt字体大小要求为整数)
  • 比例值可灵活调整:想要更大水印用0.03,更小则用0.015,根据实际视觉效果微调即可

方法二:基于文本占比精确调整

如果需要严格控制水印占图像的比例,可以通过QFontMetrics反向计算合适的字号:

// 替换原代码中设置字体的部分
QFont tempFont("Arial");
QFontMetrics fm(tempFont);
int targetWidth = newImage.width() * 0.15; // 目标宽度设为图像宽度的15%
int fontSize = 10;
// 循环调整字号,直到文本宽度达标,同时限制最大字号避免极端情况
while(fm.width(dateTime) < targetWidth && fontSize < 100){
    fontSize++;
    tempFont.setPointSize(fontSize);
    fm = QFontMetrics(tempFont);
}
painter.setFont(tempFont);

关键细节:

  • QFontMetrics用于计算指定字体下的文本宽度
  • 循环逻辑确保文本宽度达到预设比例,同时限制最大字号防止出现过大水印

内容的提问来源于stack exchange,提问作者Lincoln Ingaroca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:17:09