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;

}

各ループに費やされる時間は数秒と非常に長く、画像をサーバーに効果的に送信する前に非常に長い遅延が発生します。

アプローチ/アイデア/戦略はありますか?

どうもありがとう !

4

1 に答える 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; 
}

ありがとう

于 2013-08-23T13:45:05.637 に答える