なんか分かりにくいタイトルになってしまった。何がしたいかというと、iPad で UIImagePickerController を使用してフォトライブラリから写真を読み込む際に allowsEditing = YES にしておくと写真を選択後に画像の位置とスケールを指定することができます。UIImagePickerControllerEditedImage でその編集後の UIImage を取り出せるのですが、このサイズが 320 x 320 (厳密にはちょっと違った)で帰ってきます。これでは iPad で表示するには小さすぎます。そこで、元画像を編集後のデータを元に再度トリミングすることにしました。

ポイントは UIImagePickerControllerCropRect で編集した画像の位置とサイズが NSValue で取得できるので getValue: メソッドで CGRect の値を取得します。あとはそのデータを元に画像をトリミングすれば OK です。

- (IBAction) tapPhoto:(id)sender {
  UIImagePickerController* picker = [[UIImagePickerController alloc] init];
  picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
  picker.delegate = self;
  picker.allowsEditing = YES;
  self.popOver = [[UIPopoverController alloc] initWithContentViewController:picker];
  self.popOver.delegate = self;
  [self.popOver presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
  [picker release];
}

#pragma mark ImagePickerController Delegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
  [self.popOver dismissPopoverAnimated:YES];
  [self.popOver release];
  // get crop rect
  CGRect rect;
  [[info objectForKey:UIImagePickerControllerCropRect] getValue:&rect];
  // original image
  UIImage* oImage = [info objectForKey:UIImagePickerControllerOriginalImage];
  CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect);
  // cropped image
  UIImage *cropped =[UIImage imageWithCGImage:imageRef];
  CGImageRelease(imageRef);
}

関連する投稿