2011-12-16 2 views
1

Я хочу сжать изображение перед сохранением его как объекта NSData.Сжатие изображений в Iphone программно из NSData

Ниже приведен код, который помогает мне принять NSData объект изображения.

NSURL *referenceURL = [info objectForKey:UIImagePickerControllerReferenceURL]; 
     ALAssetsLibrary *library1 = [[ALAssetsLibrary alloc] init]; 
     [library1 assetForURL:referenceURL resultBlock:^(ALAsset *asset) 
     { 

      int byteArraySize = asset.defaultRepresentation.size; 

      NSMutableData* rawData = [[NSMutableData alloc]initWithCapacity:byteArraySize]; 
      void* bufferPointer = [rawData mutableBytes]; 

      NSError* error=nil; 
      [asset.defaultRepresentation getBytes:bufferPointer fromOffset:0 length:byteArraySize error:&error]; 
      if (error) { 
       NSLog(@"%@",error); 
      } 
      rawData = [NSMutableData dataWithBytes:bufferPointer length:byteArraySize]; 
} 

Любая помощь будет оценена по достоинству.

ответ

5

UIImagePickerController делает возвращать сжатый файл, но вы можете контролировать формат и сжатие, а также с этой встроенной функцией UIKit и связанной с ними функции для PNG файлов:

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

Вы, возможно, потребуется создать NSURL если referenceURL возвращает строку.

NSImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL: referenceURL]]; 
NSData *compressedImage = UIImageJPEGRepresentation(image, .1); //.1 is low quality 
+1

Есть данные EXIF ​​на изображении, я не могу идти на компромисс с ними. Этот метод причинит какой-либо вред моим данным EXIF. ? –

+0

Я не уверен. Попробуйте это быстро и сообщите нам. –

+0

Я новичок в Iphone, как я могу использовать этот метод? Помоги пожалуйста. –

1

Если вы используете UIImagePickerController, возвращаемое изображение будет JPEG, которое уже сжато (я думаю). Если нет, вы можете использовать AVAssetWriter для записи изображения в формате JPEG или PNG.

+0

Я хочу, чтобы сжать этот файл до 100 Кб, как сейчас его 1 Мб. –

+0

Изменяет размер изображения как опция? – Brian

+0

Есть данные EXIF ​​на изображении, я не могу идти на компромисс с ними. Этот метод причинит какой-либо вред моим данным EXIF. ? –

0

прост в использовании: -

-(UIImage *)fireYourImageForCompression:(UIImage *)imgComing{ 
NSData *dataImgBefore = [[NSData alloc] initWithData:UIImageJPEGRepresentation((imgComing), 1.0)];//.1 BEFORE COMPRESSION 
int imageSizeBefore  = (int)dataImgBefore.length; 


NSLog(@"SIZE OF IMAGE: %i ", imageSizeBefore); 
NSLog(@"SIZE OF IMAGE in Kb: %i ", imageSizeBefore/1024); 



NSData *dataCompressedImage = UIImageJPEGRepresentation(imgComing, .1); //.1 is low quality 
int sizeCompressedImage  = (int)dataCompressedImage.length; 
NSLog(@"SIZE AFTER COMPRESSION OF IMAGE: %i ", sizeCompressedImage); 
NSLog(@"SIZE AFTER COMPRESSION OF IMAGE in Kb: %i ", sizeCompressedImage/1024); //AFTER 

//now change your image from compressed data 
imgComing = [UIImage imageWithData:dataCompressedImage]; 


return imgComing;} 
Смежные вопросы