上传图片到服务器前的最佳优化方法

4

在iOS中上传图片到服务器前,最佳实践是如何优化图片的大小呢?

这些图片可以来自用户的图库,也可以直接从UIPicker - 相机模式获取。

我有一些要求:最小上传分辨率和希望的最大上传大小。

假设kMaxUploadSize = 50 kB 和 kMinUploadResolution = 1136 * 640

目前我的做法是:

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;

每个循环花费的时间非常长,几秒钟,这导致在有效发送图像到服务器之前出现了非常长的延迟。

是否有任何方法/想法/策略?

非常感谢!


你可以像这样做:https://dev59.com/lXI95IYBdhLWcg3w8y2N - rakeshNS
这个SO回答怎么样:https://dev59.com/XWkw5IYBdhLWcg3w_fmK - Uygar Y
@rakeshNS 这正是他正在做的事情... - Mundi
1个回答

11
感谢您的反馈。以下是我决定采取的行动,并且在性能方面表现良好:将大小调整为所需分辨率,然后仅在达到所需大小之前进行迭代压缩。
一些示例代码:
//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);
}

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

谢谢


2
不错的解决方法,但是这样做会失去图像的透明度。 - Iducool

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接