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:可能包含一些关于文件格式的元数据。