iphone уменьшает размер (в байтах) изображения с данными exif - PullRequest
0 голосов
/ 16 февраля 2011

У меня есть изображение, к которому я получил доступ из галереи изображений.Я хочу сохранить это изображение в базе данных, а затем изменить его размер и отправить его на сервер.Может ли кто-нибудь сказать мне, если я потеряю данные EXIF, если изображение сжато?Мое исходное изображение содержит данные EXIF.Если данные не потеряны.Пожалуйста, объясните, как я могу сжать и изменить размер изображения

Ответы [ 2 ]

4 голосов
/ 16 февраля 2011
  • Изменение размера изображения

Много ответов в этой области, например: Самый простой способ изменить размер UIImage? или более подробную информацию на https://stackoverflow.com/questions/1282830/uiimagepickercontroller-uiimage-memory-and-more

  • Сжатие изображения

Вы можете использовать функцию UIImageJPEGRepresentation C, которая объявлена ​​как ...

NSData * UIImageJPEGRepresentation (
   UIImage *image,
   CGFloat compressionQuality
);

... вы можете передать объект UIImage иустановите качество сжатия в диапазоне от 0,0 (максимальное сжатие) до 1,0 (наилучшее качество).

  • Потеря EXIF ​​

См. ответы на https://stackoverflow.com/questions/1282830/uiimagepickercontroller-uiimage-memory-and-more

0 голосов
/ 10 апреля 2013

, если вы хотите сжать изображение без потери 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];
    }
...