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

妖狐艹你老母 2022-01-20 02:39 1086阅读 0赞

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

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

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

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

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

WEBP
  1. Hex Signature
  2. 52
  3. 复制代码

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

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

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

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

  1. enum ImageFormat {
  2. case Unknow
  3. case JPEG
  4. case PNG
  5. case GIF
  6. case TIFF
  7. case WebP
  8. case HEIC
  9. case HEIF
  10. }
  11. extension Data {
  12. func getImageFormat() -> ImageFormat {
  13. var buffer = [UInt8](repeating: 0, count: 1)
  14. self.copyBytes(to: &buffer, count: 1)
  15. switch buffer {
  16. case [0xFF]: return .JPEG
  17. case [0x89]: return .PNG
  18. case [0x47]: return .GIF
  19. case [0x49],[0x4D]: return .TIFF
  20. case [0x52] where self.count >= 12:
  21. if let str = String(data: self[0...11], encoding: .ascii), str.hasPrefix("RIFF"), str.hasSuffix("WEBP") {
  22. return .WebP
  23. }
  24. case [0x00] where self.count >= 12:
  25. if let str = String(data: self[8...11], encoding: .ascii) {
  26. let HEICBitMaps = Set(["heic", "heis", "heix", "hevc", "hevx"])
  27. if HEICBitMaps.contains(str) {
  28. return .HEIC
  29. }
  30. let HEIFBitMaps = Set(["mif1", "msf1"])
  31. if HEIFBitMaps.contains(str) {
  32. return .HEIF
  33. }
  34. }
  35. default: break;
  36. }
  37. return .Unknow
  38. }
  39. }
  40. 复制代码

发表评论

表情:
评论列表 (有 0 条评论,1086人围观)

还没有评论,来说两句吧...

相关阅读