【问题标题】:How to get the uiimage format after converting it into data, getting the images from UIImagePickerController转换成数据后如何获取uiimage格式,从UIImagePickerController获取图片
【发布时间】:2014-07-29 06:51:37
【问题描述】:

我正在使用以下代码将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;
}

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

【问题讨论】:

  • 你为什么不用[NSData dataWithContentsOfFile:@"image path"];
  • @iphonic :我尝试了上面的代码,但每次它都返回 0X01,所以它不会进入 Switch 案例并返回 nil 值。

标签: ios objective-c uiimage image-formats


【解决方案1】:

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

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

【讨论】:

  • 我正在使用 UIImagePickerController 从照片库中获取图像,我尝试使用上面的代码,contentTypeForImageData 方法返回 nil。
  • 我相信这是因为 UIImage 的内部表示与它的格式无关,它使用苹果认为最有效的任何二进制格式。也许 imagePickerController:didFinishPickingMediaWithInfo: 被图像选择器调用包含一些关于文件格式的元数据。
猜你喜欢
  • 2012-04-03
  • 2016-01-10
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多