从NSData或编码图像中提取图像类型

时间:2016-07-17 18:21:33

标签: ios iphone swift base64

背景

我有一个功能,用户可以上传和发送图像从我的ios到我的rails应用程序,它适用于.jpg文件。我想让它适用于所有图像类型。我需要做的就是在API POST中发送图像类型。

到目前为止,用户上传了图片及其NSData,然后我编码为image.base64EncodedStringWithOptions并将其放入JSON并将其发送过来。这适用于.jpg。

问题

如何从NSData或图像的编码字符串中获取图像的类型?

实施例

以下是用户可能尝试上传的非常小的.png的NSData

<89504e47 0d0a1a0a 0000000d 49484452 0000000a 0000000a 08060000 008d32cf bd000000 01735247 4200aece 1ce90000 00097048 59730000 16250000 16250149 5224f000 00001c69 444f5400 00000200 00000000 00000500 00002800 00000500 00000500 00005ec1 07ed5500 00002a49 44415428 1562f88f 04181818 fea36398 34038c01 a2d11581 f8308060 11ab109b 691826e2 5284ac10 000000ff ff232a1e 6b000000 27494441 5463f80f 040c0c0c 3831481e 0418c004 0e856015 5002a742 644560c3 c0041613 c9560800 782fe719 4293f838 00000000 49454e44 ae426082>

这是

的输出
strBase64:String = image.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)
print(strBase64)

iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAAXNSR0IArs4c6QAA\r\nAAlwSFlzAAAWJQAAFiUBSVIk8AAAABxpRE9UAAAAAgAAAAAAAAAFAAAAKAAAAAUA\r\nAAAFAAAAXsEH7VUAAAAqSURBVCgVYviPBBgYGP6jY5g0A4wBotEVgfgwgGARqxCb\r\naRgm4lKErBAAAAD//yMqHmsAAAAnSURBVGP4DwQMDAw4MUgeBBjABA6FYBVQAqdC\r\nZEVgw8AEFhPJVggAeC/nGUKT+DgAAAAASUVORK5CYII=

1 个答案:

答案 0 :(得分:2)

您应该检查Base 64编码后的magic numbers in files字符串 https://en.m.wikipedia.org/wiki/Magic_number_(programming)#Magic_numbers_in_files

例如PNG

  

PNG图像文件以8字节签名开头,该签名将文件标识为PNG文件,并允许检测常见的文件传输问题:\ 211 PNG \ r \ n \ 032 \ n(89 50 4E 47 0D 0A 1A 0A )。

JPEG

  

JPEG图像文件以FF D8开头,以FF D9结束。 JPEG / JFIF文件包含“JFIF”(4A 46 49 46)的ASCII代码,作为空终止字符串。 JPEG / Exif文件包含“Exif”(45 78 69 66)的ASCII代码,也作为空终止字符串,后跟有关该文件的更多元数据。

因此,解析字符串,检测任何magic number的匹配,将magic number映射到图像文件类型。