私が知っているNSDataを取得した場合、それは画像のデータです。しかし、どの形式であるのかわかりません。 どのようにイメージの形式を識別できますか?JpegまたはPNG?NSDataの画像フォーマットを特定する方法は?
PS:iOS版は
私が知っているNSDataを取得した場合、それは画像のデータです。しかし、どの形式であるのかわかりません。 どのようにイメージの形式を識別できますか?JpegまたはPNG?NSDataの画像フォーマットを特定する方法は?
PS:iOS版は
を参照してください。インターネット上で利用可能な多くのマジックナンバーのリストがあります。 http://www.astro.keele.ac.uk/oldusers/rno/Computing/File_magic.html。
は、あなたがそれからイメージを作成し、ちょうどNSImageではどのような形式は、それがあることを求めることができますか?あなたはNSImageではを作成するために-initWithDataを使用することができます
、より多くのために、あなたが最初のバイトを見て推測を行うことができhttp://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ApplicationKit/Classes/NSImage_Class/Reference/Reference.html
が、私はその内容がその最初の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);
すべてのJPEGが4バイト目をe0として持つわけではないことを付け加えたいことがあります。さまざまな企業が作成した複数の「サブタイプ」が存在することがわかります。それらの少なくとも一部のリストについては、http://www.garykessler.net/library/file_sigs.htmlを参照してください。私がこれまで見てきたことに基づいて、上で参照した最初の3バイトが一貫していて、他のファイルタイプは同じ3バイトを使用しているようですが、どこにでも書き込まれているかどうかはわかりません。 –
ここでは、@の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
}
}
あなたは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;
どのようにNSImageの形式ですか? 私はiOSで作業していますが、その解決策がiOS上で動作するかどうかわかりません – Jimmy