2011-09-02 132 views
6

如果我得到一个NSData,我知道它是一个图像的数据。但我不知道它是什么格式。 那么我怎样才能确定它是哪种图像格式?Jpeg还是PNG?如何识别NSData的图像格式?

PS:iOS的

回答

15

我用来垫答案的基础上NSData的简单分类,它告诉我,如果它的内容是JPEG或PNG基于其前4个字节:

@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 

,然后简单地做一个:

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); 
+2

想补充一点,并非所有JPEG的第四个字节都是e0。结果发现有不同公司制造了多种“子类型”。至少请参阅http://www.garykessler.net/library/file_sigs.html部分列表。根据我迄今为止所看到的,似乎他们始终具有前面提到的前三个字节,并且没有其他文件类型似乎使用这些相同的三个字节,但我不知道这是否写在任何地方。 –

1

这里的@ apouche的回答迅捷的版本:

extension NSData { 
    func firstBytes(length: Int) -> [UInt8] { 
    var bytes: [UInt8] = [UInt8](count: length, repeatedValue: 0) 
    self.getBytes(&bytes, length: length) 
    return bytes 
    } 

    var isJPEG: Bool { 
    let signature:[UInt8] = [0xff, 0xd8, 0xff, 0xe0] 
    return firstBytes(4) == signature 
    } 

    var isPNG: Bool { 
    let signature:[UInt8] = [0x89, 0x50, 0x4e, 0x47] 
    return firstBytes(4) == signature 
    } 
} 
0

您可以创建CGImageSourceRef,然后问它为图像类型

CGImageSourceRef imageSource = CGImageSourceCreateWithData((__bridge CFDataRef) imageData, NULL); 

    if(imageSource) 
    { 
     // this is the type of image (e.g., public.jpeg - kUTTypeJPEG) 
     // <MobileCoreServices/UTCoreTypes.h> 

     CFStringRef UTI = CGImageSourceGetType(imageSource); 

     CFRelease(imageSource); 
    } 

    imageSource = nil;