iOS 常用圖片格式判斷 (Swift)

Karepbq發表於2019-05-10

常用的圖片格式有一下幾種。

  • 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
複製程式碼

iOS 常用圖片格式判斷 (Swift)

HEIF
Hex Signature
00
複製程式碼

iOS 常用圖片格式判斷 (Swift)

網上很多都是複製過來的,都知道程式碼是怎樣的。但是不知道為啥具體需要判斷如 heic, heix, mif1 等這些資訊。後來在這裡找到。file-extension.net/seeker/

WEBP
Hex Signature
52
複製程式碼

判斷 Webp 為什麼是擷取 0-12 的長度?轉換成 ASCII 之後判斷的依據?

iOS 常用圖片格式判斷 (Swift)

在 Google 官方介紹中找到了此圖。說明的是:標頭檔案的大小是 12Bytes

iOS 常用圖片格式判斷 (Swift)
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.hasPrefix("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
    }
}
複製程式碼

相關文章