现有的两个答案都有很好的建议,但要尝试讲述整个故事......
UIImage
不代表图像文件甚至图像文件格式的二进制数据。最好将 AUIImage
视为编码在该数据中的可显示图像的抽象表示——也就是说,aUIImage
是解码过程的结果。当您拥有一个UIImage
对象时,它并不关心它来自什么文件格式。
因此,正如@Ladislav 的回答所指出的那样,如果您已经有了 aUIImage
并且只想获取特定图像文件格式的数据,请调用其中一个方便的函数来获取UIImage
文件格式的数据。顾名思义,UIImageJPEGRepresentation
返回适合写入 JPEG 文件的数据。
如果您已经拥有UIImage
,UIImageJPEGRepresentation
可能是您最好的选择,因为无论原始图像格式如何,您都可以使用它。
正如@ScottCorscadden 暗示的那样,如果您没有UIImage
(还)因为您在较低级别工作以便可以访问原始文件数据,那么您需要检查该数据以判断其格式,或者询问您获得数据的任何来源,以获取描述其格式的元数据。
如果您想检查数据本身,最好阅读 HIEF 格式标准。请参阅nokiatech、MPEG 组或维基百科。
HEIF 容器格式和可以存储在其中的可能类型的媒体有很多事情要做,因此决定您是否不仅有一个 HEIF 文件,还有一个与这个或那个查看器兼容的 HEIF/HEVC 文件可能会很棘手. 由于您正在谈论排除您的服务器不支持的内容,因此从仅包含您的服务器支持的内容的角度来看,编写代码可能会更容易。也就是说,如果您有没有元数据的数据,请查找类似 JPEG 幻数的0xffd8ff
内容,并使用它来排除任何不是 JPEG 的内容。
不过,更好的方法可能是寻找元数据。如果您从带有 的照片库中挑选图像,PHImageManager.
requestImageData(for:options:resultHandler:)
则结果处理程序的第二个参数是图像数据的统一类型标识符:对于 HEIF 和 HEIC 文件,public.heif
、public.heif-standard
和public.heic
已在野外被发现。
(同样,如果您正在寻找“我的服务器不支持的图像”,您最好检查您的服务器支持的格式并拒绝不在该列表中的任何内容,而不是尝试识别所有可能的不支持的格式。)