我在 iOS 应用程序中使用 UIImagePickerController 使用 UIGraphicsBeginImageContext/UIGraphicsBeginImageContextWithOptions 在上下文中保存图像。
我最近注意到我保存并在以后显示的图片高度像素化;当我使用相同的代码返回并再次导入照片时,我得到了一张很棒的图像。在我的设备上玩了一段时间后,我发现保存的图像质量取决于我何时按下“移动和缩放”屏幕上的“选择”按钮。
如果图像是较大的图像并且当我按下按钮时仍在加载,则图像像素化......如果我等到图像加载,那很好。我的问题是,当用户按下“选择”按钮时,我有什么办法可以控制 - 有没有办法强制他们等到图像完全加载后?还是有另一种方法可以更好地解决这个问题?
- (void)choosePhoto {
//NSLog(@"%s", __FUNCTION__);
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
imagePicker.delegate = self;
imagePicker.allowsEditing = YES;
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentModalViewController:imagePicker animated:YES];
[imagePicker release];
}
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
//NSLog(@"%s", __FUNCTION__);
[self dismissModalViewControllerAnimated:YES];
UIImage *pickedImage = (UIImage*)[info objectForKey:@"UIImagePickerControllerEditedImage"];
[self setPersonImage:pickedImage];
}
- (void) setPersonImage:(UIImage *)pickedImage {
//NSLog(@"%s", __FUNCTION__);
NSManagedObjectContext *context = [[UIApplication sharedDelegate] managedObjectContext];
PersonImage *oldImage = person.image;
if (oldImage != nil) {
[context deleteObject:(NSManagedObject*)oldImage];
}
if (pickedImage != nil) {
// Create an image object for the new image.
PersonImage *newImageObject = [NSEntityDescription insertNewObjectForEntityForName:@"PersonImage" inManagedObjectContext:context];
[newImageObject setImage:pickedImage];
[person setImage:newImageObject];
}
else {
[person setImage:nil];
}
NSError *error;
if (![context save:&error]) {
exit(-1); // Fail
}
}