内容简介:常用的图片格式有一下几种。那么,怎么去判断。通常图片格式都会存储图片的网上很多都是复制过来的,都知道代码是怎样的。但是不知道为啥具体需要判断如
常用的图片格式有一下几种。
- 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
ASCII
是
RIFF
或者
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 } } 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 你有没有想过: Java 虚拟机是如何判断两个对象是否相同的?判断的流程是什么?
- iOS Rotation 判断
- 判断是否是闰年
- 数值类型(金额)限制与判断
- ansible笔记(26):条件判断
- 判断Golang接口是否实现
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。