, если вы хотите сжать изображение без потери exif, сначала вы должны получить свойство image, а полученные вами данные UIImageJPEGRepresentation не содержат exif.
1: данные о горитоатине
2: сжатие данных провайдера
3: с расширением exif для сжатия данных
- (void)setImagePropertyWith:(ALAsset *)asset
{
//get full imageData
ALAssetRepresentation * defaultRep = [asset defaultRepresentation];
Byte *buffer = (Byte*)malloc(defaultRep.size);
NSUInteger buffered = [defaultRep getBytes:buffer fromOffset:0.0 length:defaultRep.size error:nil];
NSData * data = [NSData dataWithBytesNoCopy:buffer length:buffered freeWhenDone:YES];
// compressData providerData
CGDataProviderRef jpegdata = CGDataProviderCreateWithCFData((CFDataRef)data);
CGImageRef imageRef = CGImageCreateWithJPEGDataProvider(jpegdata, NULL, YES, kCGRenderingIntentDefault);
UIImage * image = [UIImage imageWithCGImage:imageRef];
NSData* finaldata = UIImageJPEGRepresentation(image, 0.5);
//compressData with exif
finaldata = [self writeExif:(NSDictionary *)[self getPropertyOfdata:data] intoImage:finaldata];
}
- (CFDictionaryRef )getPropertyOfdata:(NSData *)data
{
CGImageSourceRef imageSource = CGImageSourceCreateWithData((CFDataRef)data, NULL);
if (imageSource == NULL) {
// Error loading image
return nil;
}
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:NO], (NSString *)kCGImageSourceShouldCache,
nil];
CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, (CFDictionaryRef)options);
NSLog(@"ori:%@",imageProperties);
return imageProperties;
// [self writeExif: (NSDictionary *)imageSource intoImageData:data];
}