2014-02-11 83 views
9

我正在使用UIImagePickerController和自定义叠加层构建应用程序。比较两幅图像(图像前和图像后)的作用是什么。在拍摄照片后,我正在使用前一张图片的自定义覆盖图(请参阅附图)。UIImagePickerController相机视图尺寸问题

iPhone 5 - ios7 enter image description here

iPhone 4 - iOS7(如果要拍摄的图像) enter image description here

iPhone 4 - 的iOS 7(后拍摄照片) enter image description here

见iPhone 4和iPhone 5相机视图之间的大小差异。

应用程序适用于iPhone 5的屏幕尺寸(iOS 6和ios7)。但iPhone 4/4s的屏幕尺寸,只有在iOS6下才能正常工作。问题是iPhone 4/4s(仅限ios7),相机视图需要全屏显示。这个意思是,你可以注意到 iPhone 5相机的视图大小〜320 * 427(iOS 6和iOS 7) iPhone 4相机的视图大小〜320 * 427(iOS 6) BUT iPhone 4相机的视图大小〜320 * 480 (IOS 7)。

图像拍摄后,它适合于320 * 427的实际尺寸。由于这个问题,我无法将图像与iPhone 4 iOS7上的相机视图对齐(因为它的尖叫声为320 * 480)。

有没有人面临这个奇怪的问题。我尝试了几乎所有的东西,但没有运气。请任何想法?

这是我的片段代码,用于在照片叠加之前加载自定义照相机视图。

- (void)loadCameraWithImage 
{ 
    if (!isLoadedOnce) 
    { 
    isLoadedOnce = YES; 
      UIImagePickerController *cameraView = [[UIImagePickerController alloc] init]; 
      cameraView.sourceType = UIImagePickerControllerSourceTypeCamera; 
      cameraView.wantsFullScreenLayout = NO; 

     if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { 
     [self setEdgesForExtendedLayout:UIRectEdgeNone]; 
     } 


    // crop before image 

    UIImage *imgTmpCropped = [self imageByCropping:imgBefore toRect:CGRectMake(0, 0, imgBefore.size.width/2, imgBefore.size.height)]; 
    UIImage *overleyImage = [[UIImage alloc] initWithCGImage: imgTmpCropped.CGImage 
                scale: [UIScreen mainScreen].scale 
              orientation: UIImageOrientationDownMirrored]; 

    UIImageView *crosshairView; 
    UIImageView *beforeView; 

    CGFloat screenHieght = [UIScreen mainScreen].bounds.size.height; 

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad){ 
     //overleyImage = [UIImage imageNamed:@"overlay_ipad.png"]; 
     crosshairView = [[UIImageView alloc] initWithImage:overleyImage]; 
     crosshairView.frame = CGRectMake(0, 0, 768, 1024); 
     [crosshairView setUserInteractionEnabled:YES]; 
     crosshairView.backgroundColor = [UIColor clearColor]; 

     beforeView = [[UIImageView alloc] initWithImage:overleyImage]; 
     beforeView.frame = CGRectMake(0, 0, 384, 1024); 
     beforeView.alpha = 0.5; 
     beforeView.contentMode = UIViewContentModeScaleAspectFill; 
    } 

    else { 
     //overleyImage = [UIImage imageNamed:@"overleyImageAfter.png"]; 
     crosshairView = [[UIImageView alloc] init]; 
     beforeView = [[UIImageView alloc] initWithImage:overleyImage]; 

     if(screenHieght>500){ 
      crosshairView.frame = CGRectMake(0, 60, 320, 480); 
      beforeView.frame = CGRectMake(0, 70, 160, 427); 
     } 
     else{ 

      if([[[UIDevice currentDevice] systemVersion] floatValue] <7.0){ 
       crosshairView.frame = CGRectMake(0, 0, 320, 480); 
       beforeView.frame = CGRectMake(0, 0, 160, 427); 
      } 
      else{ 
       crosshairView.frame = CGRectMake(0, 0, 320, 480); 
       beforeView.frame = CGRectMake(0, 0, 160, 480); 
      } 

     } 

     [crosshairView setUserInteractionEnabled:YES]; 
     crosshairView.backgroundColor = [UIColor clearColor]; 
     beforeView.alpha = 0.5; 
     beforeView.contentMode = UIViewContentModeScaleToFill; 
    } 


    //[crosshairView addSubview:beforeView]; 

    //set our custom overlay view 
    cameraView.cameraOverlayView = beforeView; 
    cameraView.delegate = (id)self; 
    cameraView.showsCameraControls = YES; 
    cameraView.navigationBarHidden = YES; 
    cameraView.toolbarHidden = YES; 
    [cameraView setHidesBottomBarWhenPushed:YES]; 


    [self.view.window.rootViewController presentViewController:cameraView animated:YES completion:nil]; 

    isLoadedOnce = NO; 
} 

}

+0

您是否曾经能够为此找到解决方案?我面临类似的问题。 –

+0

我可以解释这个问题。但你有没有找到解决办法? 随着iPhone 4(的iOS 7): 图像尺寸:{1936年,2592}这是你使用 “UIImagePickerControllerOriginalImage” 但 视图/窗口尺寸是挑选的UIImage从信息词典:{320,416}规模:2问题几乎是6.05倍,高度是6.23倍。所以当你看到这个图像时,它会被扭曲。 如果你发现了一些东西,你可以请分享?干杯 –

+0

可悲的是没有解决方案。在我的项目中,我必须遵循这个限制 – sajaz

回答

9

TL; DR

相机的预览具有在每个设备中相同的宽高比(4:3),屏幕没有。假设预览将具有该特定的高宽比,并且它将被放置在屏幕上的特定位置。在该区域内绘制覆盖图。

更长

我们面临着同样的问题。 (我们的用例是使用与卡片尺寸相同的叠加信用卡拍摄照片)。主要问题是相机预览的比例在每个设备中都是相同的(4:3),但不同的手机有不同的屏幕比例(例如iPhone 4s和iPhone 5),因此预览需要进行不同的配合,覆盖和裁剪非常困难。

我们的解决方案是(代码是有点混乱和哈克,对不起):

// Adjust camera preview to be a little bit more centered instead of adjusted to the top 
    CGSize screenSize = [[UIScreen mainScreen] bounds].size; 
    float cameraAspectRatio = 4.0/3.0; 
    float imageHeight = screenSize.width * cameraAspectRatio; 
    float verticalAdjustment; 
    if (screenSize.height - imageHeight <= 54.0f) { 
     verticalAdjustment = 0; 
    } else { 
     verticalAdjustment = (screenSize.height - imageHeight)/2.0f; 
     verticalAdjustment /= 2.0f; // A little bit upper than centered 
    } 
    CGAffineTransform transform = self.cameraController.cameraViewTransform; 
    transform.ty += verticalAdjustment; 
    self.cameraController.cameraViewTransform = transform; 

    CGRect previewFrame = CGRectMake(0, verticalAdjustment, screenSize.width, imageHeight); 
    CardPhotoView *overlayView = [[CardPhotoView alloc] initWithFrame:CGRectMake(0, 0, screenSize.width, screenSize.height) widthPercentageOfCamera:self.widthPercentageOfCamera previewFrame:previewFrame]; 
    self.overlayView = overlayView; 

    self.overlayView.delegate = self; 
    self.overlayView.useViewport = YES; 
    [self.overlayView setCameraReady:NO]; 

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(cameraIsReady:) name:AVCaptureSessionDidStartRunningNotification object:nil]; 

    self.cameraController.showsCameraControls = NO; 
    self.cameraController.navigationBarHidden = YES; 
    self.cameraController.toolbarHidden = YES; 
    self.cameraController.cameraOverlayView = self.overlayView; 

    [self presentViewController:self.cameraController animated:NO completion:nil]; 

说明

self.cameraControllerUIImagePickerControllerCardPhotoView是绘制叠加层的视图子类,它需要预览帧才能准确知道预览的位置(某些设备的顶部和底部会有黑条,有些则不会)。它还需要一个宽度百分比来添加一些填充到裁剪窗口。 另外,我们隐藏了所有的默认相机控制,我们已经实现了一些按钮,将为我们做的工作。这些按钮添加在CardPhotoView类中,并且它们是在考虑预览帧的位置的情况下绘制的。