Неправильный размер управляющего файла UIImage при его получении из NSData

У меня есть метод сжатия изображений до определенного размера, поэтому я получаю NSData с нужными байтами, но когда я конвертирую этот NSData в UIImage и UIImage в NSData, я могу проверить увеличение размера NSData (исходное значение, умноженное на 4 прибл. )

UIImage *image = [UIImage imageWithData:imageData];
NSData *newData = UIImageJPEGRepresentation(image,1.0f);

Почему это происходит?? Я просто хочу получить контроль над размером файла UIImage (для хранения в базе данных).

Я публикую свой код ниже.

Заранее спасибо.

+ (NSData *) dataOfCompressingImage:(UIImage *)pImage toMaxSize:(CGSize)pSize toFileSizeKB:(NSInteger)pFileSizeKB{

CGSize aSize;
if (pSize.width==0 || pSize.height==0){
    aSize = pImage.size;
}else{
    aSize = pSize;
}

UIImage *currentImage = [self imageWithImage:pImage scaledToSize:aSize];
NSData  *imageData    = UIImageJPEGRepresentation(currentImage, 1.0f);
NSInteger currentLength = [imageData length];

double   factor       = 1.0;
double   adjustment   = 1.0 / sqrt(2.0);  // or use 0.8 or whatever you want

while (currentLength >= (pFileSizeKB * 1024)){ //
    factor      *= adjustment;
    NSLog(@"factor: %f", factor);

    @autoreleasepool{
        imageData    = UIImageJPEGRepresentation(currentImage, factor);
    }

    if (currentLength == [imageData length]){
        break; //Exit While. Reached maximum compression level
    }else{
        currentLength = [imageData length];
    }
}

return imageData;
}

person mzurita    schedule 09.07.2014    source источник


Ответы (1)


Это происходит потому, что при выполнении UIImageJPEGRepresentation вы используете коэффициент качества 1,0, в результате чего частотные компоненты JPEG сохраняются с чрезмерно высоким разрешением.

Подумайте об этом так: если бы у вас был массив поплавков, вы МОГЛИ бы сохранить их как массив двойников, если хотите. Эти двойники будут занимать в два раза больше памяти из-за размера типа данных, но на самом деле не обеспечивают гораздо большего разрешения из-за ограниченного разрешения начальных данных.

person Aaron Chinault    schedule 09.07.2014