2

У меня есть приложение, которое позволяет пользователю выбирать изображение из камеры или библиотеки фотографий. Затем он помещает это изображение в ImageView. Затем я использую Quartz для захвата изображения из этого изображения и визуализирую его вместе с некоторыми базовыми оверлеями и т. Д.Кварцевое растягивающее изображение, выбранное из imagePickerController

Проблема в том, что когда изображение выбрано из камеры или из рулона камеры, кварц рисует изображение с помощью поворот на 90 градусов и растягивание изображения по вертикали. Нет никакой проблемы при выборе любой другой фотографии из библиотеки фотографий. И проблема не возникает, если allowImageEditing установлен в 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]; 
} 

код в представлении, что тащит Quartz

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, все работает так, как ожидалось, но когда вы получаете исходный CGImage UIImage, вы теряете эту информацию. Вы должны учитывать ориентацию изображения для себя, преобразовывая CTM (Current Transformation Matrix) CGContext.

Но недостаточно CoreGraphics использует систему координат, поскольку начало координат лежит в левом нижнем углу экрана, тогда как UIKit имеет начало в левом верхнем углу. См. Руководство по программированию 2D кварца Глава «Графические контексты». Вам нужно будет масштабировать CTM на 0, -1 и перевести его по высоте, чтобы учесть это.

В вашем примере, поскольку вы не делаете причудливые вещи с изображением, кажется наиболее подходящим попробовать UIImages drawInRect: метод, который уже учитывает оба gotchas.

Смежные вопросы