Растянутое кварцевое изображение, выбранное из imagePickerController - PullRequest
2 голосов
/ 04 июня 2009

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

Проблема заключается в том, что при съемке изображения с камеры или рулона камеры Кварц рисует изображение с поворотом на 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];
}

Код в представлении, которое рисует Кварц

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);

1 Ответ

0 голосов
/ 03 июля 2010

Проблема, с которой вы столкнулись, связана с различными системами координат и обработкой ориентации изображения в UIKit и CoreGraphics.

UIImage знает о своей ориентации, то есть ориентации камеры, когда изображение было впервые снято. Пока вы работаете с UIKit Classes, все работает как положено, но когда вы получаете необработанный CGImage UIImage, вы теряете эту информацию. Вы должны учитывать ориентацию изображения для себя, преобразовав CTM (Текущую матрицу преобразования) в CGContext.

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

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

...