我使用下面的代码创建了一个测试项目,结果如下:
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。但是,直接从文件中提取数据将报告正确的内容类型。
- (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;
}