2011-09-02 3 views

答えて

0

は、あなたがそれからイメージを作成し、ちょうどNSImageではどのような形式は、それがあることを求めることができますか?あなたはNSImageではを作成するために-initWithDataを使用することができます

、より多くのために、あなたが最初のバイトを見て推測を行うことができhttp://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSImage_Class/Reference/Reference.html

+0

どのようにNSImageの形式ですか? 私はiOSで作業していますが、その解決策がiOS上で動作するかどうかわかりません – Jimmy

15

が、私はその内容がその最初の4つのバイトに基づいて、JPEGまたはPNGの場合は私に語ったNSDataの上の簡単なカテゴリを構築するためにマットの答えを使用しました。その後、

@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が4バイト目をe0として持つわけではないことを付け加えたいことがあります。さまざまな企業が作成した複数の「サブタイプ」が存在することがわかります。それらの少なくとも一部のリストについては、http://www.garykessler.net/library/file_sigs.htmlを参照してください。私がこれまで見てきたことに基づいて、上で参照した最初の3バイトが一貫していて、他のファイルタイプは同じ3バイトを使用しているようですが、どこにでも書き込まれているかどうかはわかりません。 –

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; 
関連する問題