UIImagePickerController拍照 时间长

做项目时,发现拍照、压缩、上传至服务器的时间很长。做了Demo,研究原因有下:


1、拍照后,压缩图片花费时间长。

+ (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize


2、本地保存图片花费时间长。

- (void)saveImage:(UIImage *)tempImage WithName:(NSString *)imageName


3、取得图片尺寸花费时间长。

NSData *oriengleImageData = UIImageJPEGRepresentation(image,1);

float oriengleLength = [oriengleImageData length]/1024;



优化建议:

1、拍照后,在主线程中,仅先压缩出需要显示的小图(大图占内存大)。

2、图片显示之后,开辟另外一个线程,用以实现大图压缩、计算尺寸、本地保存。

3、图片处理线程结束以后,开辟另外线程上传至服务器。




代码如下:



- (IBAction)pickImageFromCamera:(UIButton *)sender {
//    NSDate * startDate = [NSDate date];
    imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
    imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    imagePicker.allowsEditing = NO;
    [self _initData];
    [self presentModalViewController:imagePicker animated:YES];
    
//    double totalTime = [[NSDate date] timeIntervalSinceDate:startDate];
//    self.timeLable.text = [NSString stringWithFormat:@"%.0f",totalTime * 1000];
}

- (IBAction)pickImageFromAlbum:(UIButton *)sender {

    imagePicker = [[UIImagePickerController alloc] init];
    imagePicker.delegate = self;
    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    imagePicker.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    imagePicker.allowsEditing = NO;
    [self _initData];
    [self presentModalViewController:imagePicker animated:YES];
}

- (void)_initData{
    
    self.encodeTimeLable.text = @"";
    self.saveTimeLabel.text = @"";
    self.timeLable.text = @"";
}


- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSDate * encodeStarte = [NSDate date];
    UIImage *image= [info objectForKey:@"UIImagePickerControllerOriginalImage"];
    if (picker.sourceType == UIImagePickerControllerSourceTypeCamera)
    {

      // UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    }
    UIImage * smallImage = [ViewController imageWithImageSimple:image scaledToSize:CGSizeMake(120.0, 120.0)];
    UIImage *midImage = [ViewController imageWithImageSimple:image scaledToSize:CGSizeMake(210.0, 210.0)];
//    UIImage *bigImage = [ViewController imageWithImageSimple:image scaledToSize:CGSizeMake(440.0, 440.0)];
    
       UIImage *bigImage = [ViewController imageWithImageSimple:image scaledToSize:CGSizeMake(image.size.width, image.size.height)];
    
    double encodeTime = [[NSDate date] timeIntervalSinceDate:encodeStarte];
    self.encodeTimeLable.text = [NSString stringWithFormat:@"%.0f",encodeTime * 1000];

    NSDate * saveStart = [NSDate date];
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        // 处理耗时操作的代码块...
        if ([self.switcher isOn]) {
            [self saveImage:midImage WithName:@"salesImageMid.jpg"];
            [self saveImage:bigImage WithName:@"salesImageBig.jpg"];
        }
        //通知主线程刷新
        dispatch_async(dispatch_get_main_queue(), ^{
            double saveTime = [[NSDate date] timeIntervalSinceDate:saveStart];
            self.saveTimeLabel.text = [NSString stringWithFormat:@"%.0f",saveTime * 1000];

//            double totalTime = [[NSDate date] timeIntervalSinceDate:encodeStarte];
//            self.timeLable.text = [NSString stringWithFormat:@"%.0f",totalTime * 1000];
            //回调或者说是通知主线程刷新,
        });
        
    });
    
    self.imageView.image = bigImage;
    
    //计算图片大小花费时间
    NSDate * culculateStart = [NSDate date];
    NSData * smallImageData = UIImageJPEGRepresentation(smallImage,1);
    
//    float smallLength = [smallImageData length]/1024;
//    
//    NSData *oriengleImageData = UIImageJPEGRepresentation(image,1);
//    float oriengleLength = [oriengleImageData length]/1024;
//    
//    NSData * bigImageData = UIImageJPEGRepresentation(bigImage,1);
//    float bigLength = [bigImageData length]/1024;
//    
//    self.orienbleLable.text = [NSString stringWithFormat:@"%.2f",oriengleLength];
//    self.smallLable.text = [NSString stringWithFormat:@"%.2f",smallLength];
//    self.bigLable.text = [NSString stringWithFormat:@"%.2f",bigLength];
    
    double culculatorTime = [[NSDate date] timeIntervalSinceDate:culculateStart];
    self.timeLable.text = [NSString stringWithFormat:@"%.0f",culculatorTime * 1000];
    
    [self dismissModalViewControllerAnimated:YES];
}

//压缩图片
+ (UIImage*)imageWithImageSimple:(UIImage*)image scaledToSize:(CGSize)newSize
{
    // Create a graphics image context
    UIGraphicsBeginImageContext(newSize);
    // Tell the old image to draw in this new context, with the desired
    // new size
    [image drawInRect:CGRectMake(0,0,newSize.width,newSize.height)];
    // Get the new image from the context
    UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

#pragma mark 保存图片到document
- (void)saveImage:(UIImage *)tempImage WithName:(NSString *)imageName
{
    NSData* imageData = UIImagePNGRepresentation(tempImage);
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* documentsDirectory = [paths objectAtIndex:0];
    // Now we get the full path to the file
    NSString* fullPathToFile = [documentsDirectory stringByAppendingPathComponent:imageName];
    // and then we write it out
    [imageData writeToFile:fullPathToFile atomically:NO];
}


#pragma mark 从文档目录下获取Documents路径
- (NSString *)documentFolderPath
{
    return [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值