Как определить формат изображения NSData? - PullRequest
7 голосов
/ 02 сентября 2011

Если я получу NSData, я знаю, что это данные изображения. Но я не знаю, какой это формат.Итак, как я могу определить, какой формат изображения это: JPEG или PNG?

PS: iOS

Ответы [ 5 ]

16 голосов
/ 27 июня 2012

Я использовал ответ Матса, чтобы создать простую категорию на 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);
8 голосов
/ 02 сентября 2011

Вы можете посмотреть на первые байты и сделать предположение.В Интернете доступно множество списков магических чисел, например, http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html.

1 голос
/ 10 июля 2015

Вот Swift-версия ответа @ 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 голосов
/ 23 сентября 2016

Вы можете создать 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;
0 голосов
/ 02 сентября 2011

Можете ли вы создать из этого изображение, а затем просто спросить у NSImage, в каком он формате?

Вы можете использовать -initWithData для создания NSImage, подробнее см. http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSImage_Class/Reference/Reference.html

...