Ios 如何在将uiimage格式转换为数据后从UIImagePickerController获取图像

Ios 如何在将uiimage格式转换为数据后从UIImagePickerController获取图像,ios,objective-c,uiimage,image-formats,Ios,Objective C,Uiimage,Image Formats,我正在使用以下代码将UIImage转换为数据: - (NSString*)getImageTypeWithImage:(UIImage*)img { NSData *imageData = UIImagePNGRepresentation(img); NSString *str = [self contentTypeForImageData:imageData]; return str; } 我正在使用UIImagePNGRepresentation或uiimagejpegresentatio

我正在使用以下代码将
UIImage
转换为数据:

- (NSString*)getImageTypeWithImage:(UIImage*)img
{
NSData *imageData = UIImagePNGRepresentation(img);
NSString *str = [self contentTypeForImageData:imageData];
return str;
}
我正在使用
UIImagePNGRepresentation
uiimagejpegresentation
进行转换,但它也正在将图像格式转换为PNG或JPEG。我使用下面的方法

- (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;
}

有没有办法获得准确的图像格式?请告诉我。

我使用下面的代码创建了一个测试项目,结果如下:

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;
}

为什么不使用
[NSData dataWithContentsOfFile:@“image path”]
?@iphone:我尝试了上面的代码,但每次它都返回0X01,因此它不会进入开关盒并返回nil值。我正在使用UIImagePickerController从照片库获取图像,我尝试了上面的代码,contentTypeForImageData方法返回nil。我认为这是因为UIImage的内部表示与它所使用的格式无关,它使用苹果认为最有效的二进制格式。图像选择器调用的imagePickerController:didFinishPickingMediaWithInfo:可能包含一些关于文件格式的元数据。