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

Swift中如何根据图片分辨率计算字体大小缩放比例?

解决方案

核心问题在于仅按宽度缩放无法适配不同宽高比的图片(比如竖屏长图和横屏宽图),以下是几种通用的适配方案:

1. 基于图片最短边的比例计算字号

以图片宽高中的较小值为基准,按固定比例设置字号,保证文字在任何比例的图片上视觉大小一致:

// 取图片宽高的最小值作为基准
let baseSize = min(image.size.width, image.size.height)
// 字号设为基准尺寸的5%(比例可根据需求调整)
let fontSize = baseSize * 0.05

2. 基于图片对角线长度计算字号

对角线能综合图片的宽高维度,适配所有比例的图片,字号相对图片整体的比例更均衡:

// 计算图片对角线长度
let diagonal = sqrt(pow(image.size.width, 2) + pow(image.size.height, 2))
// 字号设为对角线的3%(比例可按需调整)
let fontSize = diagonal * 0.03

3. 自适应指定区域的字号(灵活排版)

如果需要文字适配某个固定区域(比如底部1/8的高度、左半边宽度),可以通过反向推导计算合适的字号:

func calculateAdaptiveFontSize(for text: String, targetWidth: CGFloat, maxHeight: CGFloat, fontName: String = "Helvetica Bold") -> CGFloat {
    var fontSize: CGFloat = 100 // 初始大字号
    var font = UIFont(name: fontName, size: fontSize)!
    let attributes: [NSAttributedString.Key: Any] = [.font: font]
    
    // 循环调整字号,直到文字适配目标区域
    while true {
        let textSize = text.boundingRect(with: CGSize(width: targetWidth, height: .greatestFiniteMagnitude),
                                         options: .usesLineFragmentOrigin,
                                         attributes: attributes,
                                         context: nil).size
        if textSize.height <= maxHeight || fontSize <= 1 {
            break
        }
        fontSize -= 1
        font = UIFont(name: fontName, size: fontSize)!
        attributes[.font] = font
    }
    return fontSize
}

// 使用示例:让文字适配图片底部1/8高度、90%宽度的区域
let targetWidth = image.size.width * 0.9
let maxHeight = image.size.height * 0.125
let adaptiveFontSize = calculateAdaptiveFontSize(for: "123", targetWidth: targetWidth, maxHeight: maxHeight)

优化你的文字绘制代码

当前代码存在两个细节问题,建议修正:

  1. 生成图片时使用原图片的scale,避免模糊:
// 替换第三个参数为image.scale,而非固定1
UIGraphicsBeginImageContextWithOptions(image.size, false, image.scale)
  1. 精准控制文字绘制位置(以居中为例):
// 先计算文字实际尺寸
let textSize = text.boundingRect(with: image.size, options: .usesLineFragmentOrigin, attributes: textFontAttributes, context: nil).size
// 计算居中位置
let drawPoint = CGPoint(x: (image.size.width - textSize.width)/2, y: (image.size.height - textSize.height)/2)
// 使用draw(at:)而非draw(in:),避免文字拉伸
text.draw(at: drawPoint, withAttributes: textFontAttributes)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:25:29