如何让图片水印字体大小适配图像分辨率(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
相关产品推荐
相关产品推荐

