2

私はカメラや写真ライブラリから画像を選択できるアプリを持っています。次に、そのイメージをImageViewに配置します。私はQuartzを使用してその画像ビューから画像を取得し、いくつかの基本的なオーバーレイなどと一緒にレンダリングします。imagePickerControllerから選択したクォーツストレッチ画像

問題は、画像がカメラまたはカメラロールからピックされるとき、Quartzが90度回転させ、画像を垂直方向に伸ばします。 フォトライブラリから他の写真を選択しても問題はありません。また、allowsImageEditingがYESに設定されている場合は問題は発生しません。

誰かが光を当てることができれば、それは参考になるだろう、私はこれで相対的な初心者です。

私CameraViewController内のコード

#pragma mark - 
- (IBAction)getCameraPicture { 
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    picker.navigationBar.barStyle = UIBarStyleBlackOpaque; 
    picker.delegate = self; 
    picker.allowsImageEditing = NO; //seems to fix the weird rotation & stretching issues if set to YES 
    picker.sourceType = UIImagePickerControllerSourceTypeCamera; 
    [self presentModalViewController:picker animated:YES]; 
    //[picker release]; 
} 
- (IBAction)selectExistingPicture { 
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) { 
    UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
    picker.navigationBar.barStyle = UIBarStyleBlackOpaque; 
    picker.delegate = self; 
    picker.allowsImageEditing = NO; //seems to fix the weird rotation & stretching issues if set to YES (only with camera roll) 
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; 
    [self presentModalViewController:picker animated:YES]; 
    //[picker release]; 
    } 
} 
#pragma mark - 
- (void)imagePickerController:(UIImagePickerController *)picker 
didFinishPickingImage:(UIImage *)image 
    editingInfo:(NSDictionary *)editingInfo { 

    imageView.image = image; 
    NSLog(@"imagePicker image size %.0f x %.0f", image.size.width, image.size.height); 
    [picker dismissModalViewControllerAnimated:YES]; 
    [picker release]; 
    [quartzContextView setNeedsDisplay]; 
    [self setUpAndRenderImage]; 

} 
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 
    [picker dismissModalViewControllerAnimated:YES]; 
    [picker release]; 
} 

コードクォーツ

NSLog(@"Quartz image size %.0f x %.0f", drawImageTwo.size.width, drawImageTwo.size.height); 
if (drawImageTwo.size.width >= drawImageTwo.size.height) 
{ 
    scaleFactor = (insideHeight+5)/drawImageTwo.size.height; 
    xOffset = (drawImageTwo.size.width*scaleFactor - insideWidth)/2; 
    yOffset = 0; 
    NSLog(@"Image is Landscaepe"); 
} 
else if (drawImageTwo.size.width < drawImageTwo.size.height) 
{ 
    scaleFactor = (insideWidth+5)/drawImageTwo.size.width; 
    yOffset = (drawImageTwo.size.height*scaleFactor - insideHeight)/2; 
    xOffset = 0; 
    NSLog(@"Image is Portrait"); 
} 

//draw Photo Base 
CGRect baseRect = CGRectMake(0.0, 0.0, width, height); 
CGContextDrawImage (context, baseRect, drawImage.CGImage); 

//clip all further drawing to context clip 
CGContextClipToRect(context, CGRectMake(leftOffset, (height-insideHeight-topOffset), insideWidth, insideHeight)); 

//draw Photo 
CGRect photoRect = CGRectMake(leftOffset-xOffset, (height-insideHeight-topOffset)-yOffset, drawImageTwo.size.width*scaleFactor, drawImageTwo.size.height*scaleFactor); 
CGContextDrawImage (context, photoRect, drawImageTwo.CGImage); 

答えて

0

を描くビューで発生している問題は、異なる座標系とのUIKitやCoreGraphicsで画像の向きの取り扱いから来ています。

UIImageは、画像が最初に撮影されたときのカメラの向きを知っています。あなたがUIKitクラスを使って作業する限り、すべてが期待どおりに動作しますが、UIImageの生のCGImageを取得すると、この情報が失われます。 CGContextのCTM(Current Transformation Matrix)を変換することによって、自分自身でイメージの向きを考慮する必要があります。

CoreGraphicsでは座標系が使用されていません。原点は左下の画面コーナーにありますが、UIKitは左上に原点があります。 「Quartz 2D Programming Guide」の「グラフィックスコンテキスト」の章を参照してください。 CTMを0、-1でスケールし、それを考慮に入れて高さでCTMを換算する必要があります。

あなたの例では、画像ですばらしいことをしていないので、すでに両方の問題を説明しているUIImages drawInRect:メソッドを試してみるのが最も適切です。

関連する問題