Ich versuche, eine Kamera wie Instagram zu erstellen, wo der Benutzer eine Box sehen kann und das Bild würde zu dieser Box zuschneiden. Aus irgendeinem Grund geht die Kamera nicht ganz bis zum unteren Bildschirmrand und schneidet am Ende ab. Ich frage mich auch, wie ich das Bild genau in diesem Quadrat auf 320x320 zuschneiden sollte?iOS Benutzerdefinierte UIImagePickerController Kamera auf Platz zuschneiden
Antwort
Hier ist der einfachste Weg, es zu tun (ohne UIImagePickerController
Neuimplementierung). Verwenden Sie zuerst ein Overlay, um das Kamerafeld quadratisch zu machen. Hier ist ein Beispiel für 3,5" Display (müssen Sie sie aktualisieren arbeiten für iPhone 5):
UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.sourceType = source;
if (source == UIImagePickerControllerSourceTypeCamera) {
//Create camera overlay
CGRect f = imagePickerController.view.bounds;
f.size.height -= imagePickerController.navigationBar.bounds.size.height;
CGFloat barHeight = (f.size.height - f.size.width)/2;
UIGraphicsBeginImageContext(f.size);
[[UIColor colorWithWhite:0 alpha:.5] set];
UIRectFillUsingBlendMode(CGRectMake(0, 0, f.size.width, barHeight), kCGBlendModeNormal);
UIRectFillUsingBlendMode(CGRectMake(0, f.size.height - barHeight, f.size.width, barHeight), kCGBlendModeNormal);
UIImage *overlayImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *overlayIV = [[UIImageView alloc] initWithFrame:f];
overlayIV.image = overlayImage;
[imagePickerController.cameraOverlayView addSubview:overlayIV];
}
imagePickerController.delegate = self;
[self presentViewController:imagePickerController animated:YES completion:nil];
Dann, nachdem Sie ein Bild zurück vom UIImagePickerController
bekommen, Ernte es zu einem Platz mit so etwas wie diesem :.
//Crop the image to a square
CGSize imageSize = image.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
if (width != height) {
CGFloat newDimension = MIN(width, height);
CGFloat widthOffset = (width - newDimension)/2;
CGFloat heightOffset = (height - newDimension)/2;
UIGraphicsBeginImageContextWithOptions(CGSizeMake(newDimension, newDimension), NO, 0.);
[image drawAtPoint:CGPointMake(-widthOffset, -heightOffset)
blendMode:kCGBlendModeCopy
alpha:1.];
image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
und fertig
@Anders Antwort war ganz in der Nähe für mich auf dem iPhone 5. ich habe die folgende Änderung korrigieren ein Overlay für iPhone 5 fest einprogrammiert hinzuzufügen:
CGRect f = imagePickerController.view.bounds;
f.size.height -= imagePickerController.navigationBar.bounds.size.height;
UIGraphicsBeginImageContext(f.size);
[[UIColor colorWithWhite:0 alpha:.5] set];
UIRectFillUsingBlendMode(CGRectMake(0, 0, f.size.width, 124.0), kCGBlendModeNormal);
UIRectFillUsingBlendMode(CGRectMake(0, 444, f.size.width, 52), kCGBlendModeNormal);
UIImage *overlayImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageView *overlayIV = [[UIImageView alloc] initWithFrame:f];
overlayIV.image = overlayImage;
overlayIV.alpha = 0.7f;
[imagePickerController setCameraOverlayView:overlayIV];`
Ich hoffe, das hilft jemandem.
Meine Erfahrung mit diesem auf IOS7 auf einem iPhone 5 war nicht großartig. Insbesondere konnte ich das Overlay sehen, aber ich konnte die nativen Zoom-Steuerelemente nicht verwenden. Schließlich, als ich das Foto gemacht habe und die "Retake" und "Use Photo" Tasten erschienen sind, konnte ich keinen der beiden Buttons anklicken. YMMV –
Danke funktioniert super! Ich frage mich, ob es überhaupt möglich ist, dass die Kamera-Eröffnungs-Animation über das Overlay geht? – NSDavidObject
Nein, leider gibt es keine Möglichkeit, dies mit öffentlich dokumentierten APIs zu tun (d. H. Ohne etwas zu tun, das Apple dazu veranlassen würde, die App abzulehnen). Wenn Sie dies richtig machen möchten, müssen Sie 'UIImagePickerController' neu implementieren. – Ander
Was sollten wir ändern, damit es sowohl auf dem iPhone 5 als auch auf früheren iPhones funktioniert? –