Jia*_*ang 5 cocoa-touch uiimage ios heif
我的服务器不支持HEIF格式.所以我需要在从我的应用程序上传之前将其转换为JPEG.
我这样做:
UIImage *image = [UIImage imageWithData:imageData]; NSData *data=UIImageJPEGRepresentation(image, 1.0);
Run Code Online (Sandbox Code Playgroud)
但我怎么知道数据是HEIF(或HEIC)?我可以查看一个文件:
([filePath hasSuffix:@".HEIC"] || [filePath hasSuffix:@".heic"]
但我不认为这是一个很好的答案.还有其他解决方案吗?
现有的答案都有很好的建议,但试图讲述整个故事......
UIImage不代表图像文件,甚至不代表图像文件格式的二进制数据.A UIImage最好被认为是在该数据中编码的可显示图像的抽象表示- 也就是说,a UIImage是解码过程的结果.当你有一个UIImage对象时,它并不关心它来自哪种文件格式.
因此,正如@ Ladislav的答案所述,如果您已经拥有UIImage并且您只想获得特定图像文件格式的数据,请调用其中一个便捷函数来获取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已经在野外发现.
(同样,不过,如果你要寻找的"我的服务器不支持图像",你最好检查你的服务器的格式不支持,并在名单上没有任何拒绝,而不是试图找出所有可能的不支持的格式.)
当您发送到服务器时,您很可能会解码UIImage并发送它,就像Data这样
let data = UIImageJPEGRepresentation(image, 0.9)
Run Code Online (Sandbox Code Playgroud)
只需确定哪种质量最适合您,这里是 0.9
| 归档时间: |
|
| 查看次数: |
4129 次 |
| 最近记录: |