以下のコードを使用してテスト プロジェクトを作成した結果、次のようになりました。
2014-07-29 09:31:02.904 test[64366:60b] test.jpg = image/jpeg
2014-07-29 09:31:02.907 test[64366:60b] test.png = image/jpeg
2014-07-29 09:31:02.909 test[64366:60b] test.gif = image/jpeg
2014-07-29 09:31:02.909 test[64366:60b] ---
2014-07-29 09:31:02.910 test[64366:60b] test.jpg = image/jpeg
2014-07-29 09:31:02.910 test[64366:60b] test.png = image/png
2014-07-29 09:31:02.910 test[64366:60b] test.gif = image/gif
UIImage は常に jpeg を報告するため、UIImage からデータを抽出することは明らかに良い考えではありません。ただし、ファイルから直接データを抽出すると、正しいコンテンツ タイプが報告されます。
- (void)test
{
[self logContentTypeForImageFile:@"test.jpg"];
[self logContentTypeForImageFile:@"test.png"];
[self logContentTypeForImageFile:@"test.gif"];
NSLog(@"---");
[self logContentTypeForResource:@"test" ofType:@"jpg"];
[self logContentTypeForResource:@"test" ofType:@"png"];
[self logContentTypeForResource:@"test" ofType:@"gif"];
}
- (void)logContentTypeForResource:(NSString*)resource ofType:(NSString*)type
{
NSString *filename = [[NSBundle mainBundle] pathForResource:resource ofType:type];
NSData *data = [NSData dataWithContentsOfFile:filename];
NSString *result = [self contentTypeForImageData:data];
NSLog(@"%@.%@ = %@", resource, type, result);
}
- (void)logContentTypeForImageFile:(NSString*)filename
{
UIImage *image = [UIImage imageNamed:filename];
CGDataProviderRef provider = CGImageGetDataProvider(image.CGImage);
NSData *data = (id)CFBridgingRelease(CGDataProviderCopyData(provider));
NSString *result = [self contentTypeForImageData:data];
NSLog(@"%@ = %@", filename, result);
}
- (NSString *)contentTypeForImageData:(NSData *)data
{
uint8_t c;
[data getBytes:&c length:1];
switch (c) {
case 0xFF:
return @"image/jpeg";
case 0x89:
return @"image/png";
case 0x47:
return @"image/gif";
case 0x49:
break;
case 0x42:
return @"image/bmp";
case 0x4D:
return @"image/tiff";
}
return nil;
}