做项目时,发现拍照、压缩、上传至服务器的时间很长。做了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"];
}