经常使用的图片格式有一下几种。html
那么,怎么去判断。一般图片格式都会存储图片的 Hex Signature
中(十六进制签名) 相信地址能够参考:www.garykessler.net/library/fil…web
Hex Signature
FF D8
复制代码
Hex Signature
89 50 4E 47 0D 0A 1A 0A
复制代码
Hex Signature
47 49 46 38 37 61 or
47 49 46 38 39 61
复制代码
Hex Signature
49 20 49 or
49 49 2A 00 or
4D 4D 00 2B or
4D 4D 00 2A
复制代码
Hex Signature
00
复制代码
Hex Signature
00
复制代码
网上不少都是复制过来的,都知道代码是怎样的。可是不知道为啥具体须要判断如 heic
, heix
, mif1
等这些信息。后来在这里找到。file-extension.net/seeker/网络
Hex Signature
52
复制代码
判断 Webp 为何是截取 0-12 的长度?转换成 ASCII 以后判断的依据?优化
在 Google 官方介绍中找到了此图。说明的是:头文件的大小是 12Bytes
google
ASCII
是
RIFF
或者
WEBP
Google Developer:
developers.google.com/speed/webp/…
明白了原理以后,就是代码咯!spa
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
}
}
复制代码