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

Swift中如何获取Base64编码图片的真实尺寸(宽高)?

如何获取Base64编码图片的真实大小 & Swift中获取其宽高维度

嘿,这个问题我日常开发中碰到过好多次,给你详细拆解一下解决方案:

一、计算Base64编码图片的真实文件大小

Base64本质是把二进制图片数据转成了文本格式,所以它的“真实大小”就是原图片二进制数据的字节数,计算起来很简单,分三步:

  • 第一步:先去掉Base64字符串开头的数据URI头部——就是类似 data:image/png;base64, 这段前缀,只保留后面纯Base64编码的部分。
  • 第二步:数一下纯Base64字符串末尾的填充符=数量(Base64用=来补全长度到4的倍数,最多2个)。
  • 第三步:用公式计算真实字节数:
    真实字节数 = (纯Base64字符串长度 × 3) / 4 - 填充符数量
    

举个例子:如果纯Base64字符串长度是8,末尾有1个=,那真实大小就是 (8×3)/4 -1 = 6-1=5 字节,完全对应原图片的二进制大小。

二、Swift中获取Base64图片的宽高维度

在Swift里,有两种常见方式可以拿到图片的宽高,按需选就行:

方式一:简单直接(适合普通大小的图片)

把Base64转成Data,再初始化UIImage,直接读取它的size属性就行,代码示例如下:

func getImageSize(from base64String: String) -> (width: CGFloat, height: CGFloat)? {
    // 先清理掉可能存在的Data URI前缀
    var cleanBase64 = base64String
    if let prefixRange = cleanBase64.range(of: "^data:image/[^;]+;base64,", options: .regularExpression) {
        cleanBase64.removeSubrange(prefixRange)
    }
    
    // 转成Data
    guard let imageData = Data(base64Encoded: cleanBase64) else {
        print("Base64格式无效,转Data失败")
        return nil
    }
    
    // 初始化UIImage并获取尺寸
    guard let image = UIImage(data: imageData) else {
        print("无法将Data解析为图片")
        return nil
    }
    
    return (image.size.width, image.size.height)
}

// 使用示例
if let size = getImageSize(from: "你的Base64图片字符串") {
    print("图片宽度:\(size.width),高度:\(size.height)")
} else {
    print("获取图片尺寸失败")
}

方式二:高效低内存(适合大图片)

如果你的Base64图片是高清大图,上面的方法会把整个图片解码到内存里,有点浪费资源。这时候可以用ImageIO框架的CGImageSource,只读取图片的元数据,不解码整个图片,性能更好:

import ImageIO

func getImageSizeEfficiently(from base64String: String) -> (width: CGFloat, height: CGFloat)? {
    var cleanBase64 = base64String
    if let prefixRange = cleanBase64.range(of: "^data:image/[^;]+;base64,", options: .regularExpression) {
        cleanBase64.removeSubrange(prefixRange)
    }
    
    guard let imageData = Data(base64Encoded: cleanBase64) else {
        print("Base64格式无效")
        return nil
    }
    
    // 创建图片源,只读取元数据
    guard let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil) else {
        print("创建图片源失败")
        return nil
    }
    
    // 获取图片属性
    guard let properties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, nil) as? [CFString: Any] else {
        print("获取图片属性失败")
        return nil
    }
    
    // 提取宽高
    guard let width = properties[kCGImagePropertyPixelWidth] as? CGFloat,
          let height = properties[kCGImagePropertyPixelHeight] as? CGFloat else {
        print("无法提取图片宽高")
        return nil
    }
    
    return (width, height)
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:53:42