【问题标题】:Quartz stretching image selected from imagePickerController从 imagePickerController 中选择的 Quartz 拉伸图像
【发布时间】:2010-10-31 03:31:02
【问题描述】:

我有一个应用程序,它允许用户从相机或照片库中选择图像。然后它将该图像放置在 ImageView 中。然后我使用 Quartz 从该图像视图中抓取图像并将其与一些基本叠加层等一起渲染。

问题在于,当从相机或相机胶卷中拾取图像时,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];
}

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

【问题讨论】:

    标签: iphone cocoa-touch quartz-graphics uiimagepickercontroller


    【解决方案1】:

    您遇到的问题来自不同的坐标系和 UIKit 和 CoreGraphics 中图像方向的处理。

    UIImage 知道它的方向,即第一次拍摄图像时相机的方向。只要您使用 UIKit 类,一切都会按预期工作,但是当您获得 UIImage 的原始 CGImage 时,您会丢失此信息。您必须自己考虑图像方向,通过转换 CGContext 的 CTM(当前转换矩阵)。

    但 CoreGraphics 使用坐标系的地方不够多,原点位于屏幕左下角,而 UIKit 的原点位于左上角。请参阅 Quartz 2D 编程指南章节“图形上下文”。您必须将 CTM 缩放 0,-1 并将其转换为高度以解决此问题。

    在您的示例中,由于您没有对图像进行花哨的处理,因此尝试 UIImages drawInRect: 方法似乎最合适,该方法已经解决了这两个问题。

    【讨论】:

      猜你喜欢
      • 2020-12-01
      • 1970-01-01
      • 2011-08-21
      • 2013-05-15
      • 1970-01-01
      • 2014-03-29
      • 2014-02-17
      • 1970-01-01
      相关资源
      最近更新 更多