如何识别NSData的图像格式?

Jim*_*mmy 7 png jpeg image nsdata

如果我得到一个NSData,我知道它是图像的数据.但我不知道它是什么格式.那么如何识别它的图像格式呢?Jpeg还是PNG?

PS:iOS版

apo*_*che 16

我使用Mats回答在NSData上构建一个简单的类别,告诉我它的内容是基于前4个字节的JPEG或PNG:

@interface NSData (yourCategory)

- (BOOL)isJPG;
- (BOOL)isPNG;

@end

@implementation NSData (yourCategory)
- (BOOL)isJPG
{
    if (self.length > 4)
    {
        unsigned char buffer[4];
        [self getBytes:&buffer length:4];

        return buffer[0]==0xff && 
               buffer[1]==0xd8 && 
               buffer[2]==0xff &&
               buffer[3]==0xe0;
    }

    return NO;
}

- (BOOL)isPNG
{
    if (self.length > 4)
    {
        unsigned char buffer[4];
        [self getBytes:&buffer length:4];

        return buffer[0]==0x89 &&
               buffer[1]==0x50 &&
               buffer[2]==0x4e &&
               buffer[3]==0x47;
    }

    return NO;
}

@end
Run Code Online (Sandbox Code Playgroud)

然后,只需做一个:

CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData((CFDataRef) imgData);
CGImageRef imgRef = nil;

if ([imgData isJPG])
    imgRef = CGImageCreateWithJPEGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault);
else if ([imgData isPNG])
    imgRef = CGImageCreateWithPNGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault);

UIImage* image = [UIImage imageWithCGImage:imgRef];

CGImageRelease(imgRef);
CGDataProviderRelease(imgDataProvider);
Run Code Online (Sandbox Code Playgroud)

  • 就像添加并非所有JPEG都将第四个字节作为e0.事实证明,各种公司都有多种"子类型".请参阅http://www.garykessler.net/library/file_sigs.html以获取至少部分列表.根据我到目前为止看到的情况,似乎它们始终具有上面引用的前三个字节,并且没有其他文件类型似乎使用相同的三个字节,但我不知道这是否是在任何地方写的. (2认同)

Mat*_*ats 8

您可以查看第一个字节并进行猜测.互联网上有许多魔术数字列表,例如http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html.