Best way to optimize image before uploading to server

What's the best practice to optimize the weight of an image before uploading it on the server in iOS?

The image can from the images library of the user or directly for the UIPicker - camera mode.

I do have some requirements : a minimum upload resolution and a wished maximum upload size.

Let 's say kMaxUploadSize = 50 kB and kMinUploadResolution = 1136 * 640

What I currently do is :

while (UIImageJPEGRepresentation(img,1.0).length > MAX_UPLOAD_SIZE){
    img = [self scaleDown:img withFactor:0.1];
}
NSData *imageData = UIImageJPEGRepresentation(img,1.0);

-(UIImage*)scaleDown:(UIImage*)img withFactor:(float)f{

CGSize newSize = CGSizeMake(img.size.width*f, img.size.height*f);

UIGraphicsBeginImageContextWithOptions(newSize, YES, 0.0);
[img drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return scaledImage;

}

The time spend in each loop is awfully, several seconds, which leads to a very long delay before effectively sending the image to the server.

Any approach / idea / strategy ?

Thanks a lot !

Answers


thanks your for your feedback. Here is what I decided to do and is great in terms of performances : resizing to the wished resolution, then and only then do iterative compression until reachning the wished size.

Some sample code :

//Resize the image 
float factor;
float resol = img.size.height*img.size.width;
if (resol >MIN_UPLOAD_RESOLUTION){
    factor = sqrt(resol/MIN_UPLOAD_RESOLUTION)*2;
    img = [self scaleDown:img withSize:CGSizeMake(img.size.width/factor, img.size.height/factor)];
}

//Compress the image
CGFloat compression = 0.9f;
CGFloat maxCompression = 0.1f;

NSData *imageData = UIImageJPEGRepresentation(img, compression);

while ([imageData length] > MAX_UPLOAD_SIZE && compression > maxCompression)
{
    compression -= 0.10;
    imageData = UIImageJPEGRepresentation(img, compression);
    NSLog(@"Compress : %d",imageData.length);
}

and

-(UIImage*)scaleDown:(UIImage*)img withSize:(CGSize)newSize{


UIGraphicsBeginImageContextWithOptions(newSize, YES, 0.0);
[img drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

return scaledImage;

}

Thanks


Need Your Help

Security vulnerabilities of letting users add content to a site's header

javascript security google-analytics

In my application I let registered users create their own personal website, and I want to let them add an analytics code into the sites header. I understand that there is a risk letting them add th...

Wand Python multi-size icon

python ico magickwand wand

i'm trying to use Wand to create a multi-size ico, but i don't find anything talking about that, only normal conversion, to ico... i've found "Sequences":

About UNIX Resources Network

Original, collect and organize Developers related documents, information and materials, contains jQuery, Html, CSS, MySQL, .NET, ASP.NET, SQL, objective-c, iPhone, Ruby on Rails, C, SQL Server, Ruby, Arrays, Regex, ASP.NET MVC, WPF, XML, Ajax, DataBase, and so on.