swift - 判斷圖片型別
阿新 • • 發佈:2021-07-14
import Foundation import UIKit extension Data { enum ImageType { case unknown case jpeg case jpeg2000 case tiff case bmp case ico case icns case gif case png case webp } func detectImageType() -> Data.ImageType {籤 名:被別人嫉妒,說明你卓越;你嫉妒別人,說明你無能。 座右銘:抓緊一切時間睡覺。if self.count < 16 { return .unknown } var value = [UInt8](repeating:0, count:1) self.copyBytes(to: &value, count: 1) switch value[0] { case 0x4D, 0x49: return .tiff case 0x00: return .ico case 0x69:return .icns case 0x47: return .gif case 0x89: return .png case 0xFF: return .jpeg case 0x42: return .bmp case 0x52: let subData = self.subdata(in: Range(NSMakeRange(0, 12))!) if let infoString = String(data: subData, encoding: .ascii) {if infoString.hasPrefix("RIFF") && infoString.hasSuffix("WEBP") { return .webp } } break default: break } return .unknown } static func detectImageType(with data: Data) -> Data.ImageType { return data.detectImageType() } static func detectImageType(with url: URL) -> Data.ImageType { if let data = try? Data(contentsOf: url) { return data.detectImageType() } else { return .unknown } } static func detectImageType(with filePath: String) -> Data.ImageType { let pathUrl = URL(fileURLWithPath: filePath) if let data = try? Data(contentsOf: pathUrl) { return data.detectImageType() } else { return .unknown } } static func detectImageType(with imageName: String, bundle: Bundle = Bundle.main) -> Data.ImageType? { guard let path = bundle.path(forResource: imageName, ofType: "") else { return nil } let pathUrl = URL(fileURLWithPath: path) if let data = try? Data(contentsOf: pathUrl) { return data.detectImageType() } else { return nil } } }