iOS 常用图片格式判断 (Swift)

常用的图片格式有一下几种。

  • PNG
  • JPEG
  • GIF
  • WebP 是 Google 制造的一个图片格式,针对网络上快速传输就行了优化
  • TIFF/TIF 在数字影响、遥感、医学等领域中得到了广泛的应用。TIFF文件的后缀是.tif或者.tiff
  • HEIC iOS11 后,苹果拍照图片的默认格式
  • HEIF 用于存储动态图像

那么,怎么去判断。通常图片格式都会存储图片的 Hex Signature 中(十六进制签名) 相信地址可以参考:www.garykessler.net/library/fil…

JPGE 二进制数据前两个字节数据为
Hex Signature
FF D8
复制代码
PNG
Hex Signature
89 50 4E 47 0D 0A 1A 0A
复制代码
GIF
Hex Signature
47 49 46 38 37 61 or
47 49 46 38 39 61
复制代码
TIFF
Hex Signature
49 20 49 or
49 49 2A 00 or
4D 4D 00 2B or
4D 4D 00 2A
复制代码
HEIC
Hex Signature
00
复制代码

HEIF
Hex Signature
00
复制代码

网上很多都是复制过来的,都知道代码是怎样的。但是不知道为啥具体需要判断如 heic, heix, mif1 等这些信息。后来在这里找到。file-extension.net/seeker/

WEBP
Hex Signature
52
复制代码

判断 Webp 为什么是截取 0-12 的长度?转换成 ASCII 之后判断的依据?

在 Google 官方介绍中找到了此图。说明的是:头文件的大小是 12Bytes

WEBP的 header 中写明了 ASCIIRIFF 或者 WEBP Google Developer: developers.google.com/speed/webp/…

明白了原理之后,就是代码咯!

enum ImageFormat {
    case Unknow
    case JPEG
    case PNG
    case GIF
    case TIFF
    case WebP
    case HEIC
    case HEIF
}
extension Data {
    func getImageFormat() -> ImageFormat  {
        var buffer = [UInt8](repeating: 0, count: 1)
        self.copyBytes(to: &buffer, count: 1)
        
        switch buffer {
        case [0xFF]: return .JPEG
        case [0x89]: return .PNG
        case [0x47]: return .GIF
        case [0x49],[0x4D]: return .TIFF
        case [0x52] where self.count >= 12:
            if let str = String(data: self[0...11], encoding: .ascii), str.hasPrefix("RIFF"), str.hasSuffix("WEBP") {
                return .WebP
            }
        case [0x00] where self.count >= 12:
            if let str = String(data: self[8...11], encoding: .ascii) {
                let HEICBitMaps = Set(["heic", "heis", "heix", "hevc", "hevx"])
                if HEICBitMaps.contains(str) {
                    return .HEIC
                }
                let HEIFBitMaps = Set(["mif1", "msf1"])
                if HEIFBitMaps.contains(str) {
                    return .HEIF
                }
            }
        default: break;
        }
        return .Unknow
    }
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值