2014-02-11 3 views
9

Ich baue eine App mit dem UIImagePickerController und einem benutzerdefinierten Overlay. Was ist, ist der Vergleich zweier Bilder (vor dem Bild und nach dem Bild). Ich verwende ein benutzerdefiniertes Overlay mit dem Vorher-Bild, wenn ich das Nachher-Foto mache (siehe Bild im Anhang).UIImagePickerController Kameraansicht Größe Problem

iPhone 5 - ios7 enter image description here

iPhone 4 - iOS7 (Bei der Aufnahme des Bildes) enter image description here

iPhone 4 - iOS 7 (Nach der Aufnahme des Fotos) enter image description here

Siehe Größenunterschied zwischen iPhone 4 und iPhone 5 Kameraansicht.

Anwendung funktioniert gut mit iPhone 5 Bildschirmgröße (Beide ios 6 und ios7). Aber iPhone 4/4s Bildschirmgröße, funktioniert es NUR mit iOS6. Das Problem ist mit dem iPhone 4/4s (nur iOS 7), Kamera-Ansicht nimmt den ganzen Bildschirm. Das bedeutet, können Sie iPhone 5 Kamera-Ansicht Größe ~ 320 * 427 (iOS 6 und iOS 7) iPhone 4 Kamera-Ansicht Größe ~ 320 * 427 (iOS 6) ABER iPhone 4 Kamera-Ansicht Größe ~ 320 * 480 merken (iOS 7)

Nachdem das Bild aufgenommen wurde, passte es zu der tatsächlichen Größe von 320 * 427. Wegen dieses Problems kann ich nicht vor dem Bild mit der Kamera auf dem iPhone 4 iOS7 ausrichten (weil es zu 320 * 480 kreischt).

Hat jemand dieses seltsame Problem konfrontiert. Ich habe fast alles versucht, aber KEIN Glück. Irgendwelche Ideen bitte ???

Dies ist mein Stückcode zum Laden der Kameraansicht mit benutzerdefinierten vor Foto-Overlay.

- (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

Konnten Sie jemals eine Entschließung für dieses finden? Ich habe ein ähnliches Problem. –

+0

Ich kann das Problem erklären. Aber hast du irgendeine Lösung gefunden? Mit dem iPhone 4 (iOS 7): Größe des Bildes: {1936, 2592} ist dies Sie UIImage von Info-Wörterbuch mit "UIImagePickerControllerOriginalImage" aber Ansicht/Fenster-Größe ist wählen: {320, 416} Skala: 2. Problem ist Breite 6,05 mal und Höhe ist 6,23 fast. Wenn Sie dieses Bild sehen, wird es verzerrt. Wenn Sie etwas gefunden haben, können Sie bitte teilen? Prost –

+0

Leider keine Lösung. In meinem Projekt musste ich mit dieser Einschränkung gehen – sajaz

Antwort

9

TL; DR

Kamera Vorschau hat das gleiche Seitenverhältnis in jedem Gerät (4: 3), Bildschirm nicht. Die Vorschau wird dieses spezifische Seitenverhältnis haben und an einer bestimmten Position auf dem Bildschirm erscheinen. Zeichnen Sie Ihr Overlay in diesem Bereich.

Längerer:

Wir standen vor dem gleichen Problem. (Unser Anwendungsfall ist die Aufnahme von Kreditkarten mit einem Overlay in der gleichen Größe wie eine Karte). Das Hauptproblem besteht darin, dass die Proportionen der Kameravorschau bei jedem Gerät immer gleich sind (4: 3), aber unterschiedliche Telefone unterschiedliche Proportionen haben (iPhone 4s zum Beispiel iPhone 5), so dass die Vorschau anders angepasst werden muss ein Overlay und Cropping das sehr schwierig.

Unsere Lösung war (der Code ist etwas chaotisch und Hacky, sorry):

// 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]; 

Erklärung:

self.cameraController ist ein UIImagePickerController.CardPhotoView ist eine View-Unterklasse, die das Overlay zeichnet, es benötigt den Vorschau-Frame, um genau zu wissen, wo die Vorschau positioniert wird (einige Geräte haben schwarze Balken oben und unten, andere nicht). Es erfordert auch eine Breite, um dem Zuschneidefenster eine kleine Füllung hinzuzufügen. Außerdem haben wir alle Standard-Kamerasteuerungen versteckt und wir haben einige Tasten implementiert, die die Arbeit für uns erledigen. Diese Schaltflächen werden in der Klasse CardPhotoView hinzugefügt, und sie werden unter Berücksichtigung des Vorschaurahmens gezeichnet.