Сжатие изображений в Iphone программно из NSData - PullRequest
1 голос
/ 16 декабря 2011

Я хочу сжать изображение перед тем, как сохранить его как 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];
}

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

Ответы [ 3 ]

6 голосов
/ 16 декабря 2011

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 голос
/ 16 декабря 2011

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

0 голосов
/ 11 августа 2015

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

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