1

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

- (NSString*)getImageTypeWithImage:(UIImage*)img
{
NSData *imageData = UIImagePNGRepresentation(img);
NSString *str = [self contentTypeForImageData:imageData];
return str;
}

我正在使用UIImagePNGRepresentationUIImageJPEGRepresentation转换,但它也将图像格式转换为 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;
}

有没有办法我可以获得确切的图像格式..请告诉我。

4

1 回答 1

0

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

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;
}
于 2014-07-29T07:32:26.520 回答