Le taux d'image de l'iPhone capturé à partir de AVCaptureSession

Je suis avec quelqu'un du code source pour la capture d'image avec AVCaptureSession. Cependant,j'ai trouvé que CaptureSessionManager de previewLayer est shotter puis la dernière image capturée.Le taux d'image de l'iPhone capturé à partir de AVCaptureSession

J'ai trouvé que l'image est toujours avec un ratio 720x1280=9:16. Maintenant, je veux recadrer l'image à une UIImage avec un ratio de 320:480 de sorte qu'il sera de capturer uniquement la partie visible sur previewLayer. Une Idée? Merci beaucoup.

Questions pertinentes dans stackoverflow(PAS de bonne réponse pour l'instant):
T1
T2

Code Source:

- (id)init {
if ((self = [super init])) {
[self setCaptureSession:[[[AVCaptureSession alloc] init] autorelease]];
}
return self;
}
- (void)addVideoPreviewLayer {
[self setPreviewLayer:[[[AVCaptureVideoPreviewLayer alloc] initWithSession:[self captureSession]] autorelease]];
[[self previewLayer] setVideoGravity:AVLayerVideoGravityResizeAspectFill];
}
- (void)addVideoInput {
AVCaptureDevice *videoDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];   
if (videoDevice) {
NSError *error;
if ([videoDevice isFocusModeSupported:AVCaptureFocusModeContinuousAutoFocus] && [videoDevice lockForConfiguration:&error]) {
[videoDevice setFocusMode:AVCaptureFocusModeContinuousAutoFocus];
[videoDevice unlockForConfiguration];
}        
AVCaptureDeviceInput *videoIn = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];
if (!error) {
if ([[self captureSession] canAddInput:videoIn])
[[self captureSession] addInput:videoIn];
else
NSLog(@"Couldn't add video input");     
}
else
NSLog(@"Couldn't create video input");
}
else
NSLog(@"Couldn't create video capture device");
}
- (void)addStillImageOutput 
{
[self setStillImageOutput:[[[AVCaptureStillImageOutput alloc] init] autorelease]];
NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey,nil];
[[self stillImageOutput] setOutputSettings:outputSettings];
AVCaptureConnection *videoConnection = nil;
for (AVCaptureConnection *connection in [[self stillImageOutput] connections]) {
for (AVCaptureInputPort *port in [connection inputPorts]) {
if ([[port mediaType] isEqual:AVMediaTypeVideo] ) {
videoConnection = connection;
break;
}
}
if (videoConnection) { 
break; 
}
}
[[self captureSession] addOutput:[self stillImageOutput]];
}
- (void)captureStillImage
{  
AVCaptureConnection *videoConnection = nil;
for (AVCaptureConnection *connection in [[self stillImageOutput] connections]) {
for (AVCaptureInputPort *port in [connection inputPorts]) {
if ([[port mediaType] isEqual:AVMediaTypeVideo]) {
videoConnection = connection;
break;
}
}
if (videoConnection) { 
break; 
}
}
NSLog(@"about to request a capture from: %@", [self stillImageOutput]);
[[self stillImageOutput] captureStillImageAsynchronouslyFromConnection:videoConnection 
completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { 
CFDictionaryRef exifAttachments = CMGetAttachment(imageSampleBuffer, kCGImagePropertyExifDictionary, NULL);
if (exifAttachments) {
NSLog(@"attachements: %@", exifAttachments);
} else { 
NSLog(@"no attachments");
}
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];    
UIImage *image = [[UIImage alloc] initWithData:imageData];
[self setStillImage:image];
[image release];
[[NSNotificationCenter defaultCenter] postNotificationName:kImageCapturedSuccessfully object:nil];
}];
}


Modifier après avoir fait un peu plus de recherche et de tests:
AVCaptureSession de la propriété "sessionPreset" a les constantes suivantes, je n'ai pas vérifié chacun d'eux, mais a noté que la plupart d'entre eux ratio est de 9:16, ou 3:4,

  • NSString *const AVCaptureSessionPresetPhoto;
  • NSString *const AVCaptureSessionPresetHigh;
  • NSString *const AVCaptureSessionPresetMedium;
  • NSString *const AVCaptureSessionPresetLow;
  • NSString *const AVCaptureSessionPreset352x288;
  • NSString *const AVCaptureSessionPreset640x480;
  • NSString *const AVCaptureSessionPresetiFrame960x540;
  • NSString *const AVCaptureSessionPreset1280x720;
  • NSString *const AVCaptureSessionPresetiFrame1280x720;

Dans Mon projet, j'ai le plein écran de prévisualisation(taille de l'image est 320x480)
aussi: [[auto previewLayer] setVideoGravity:AVLayerVideoGravityResizeAspectFill];

Je l'ai fait de cette façon: prendre la photo en taille 9:16 et recadrer à 320:480, exactement la partie visible de l'previewlayer. Il a l'air parfaite.

Le morceau de code pour le redimensionnement et la croping de le remplacer avec de l'ancien code est

NSData *imageData = [AVCaptureStillImageOutput  jpegStillImageNSDataRepresentation:imageSampleBuffer];
UIImage *image = [UIImage imageWithData:imageData]; 
UIImage *scaledimage=[ImageHelper scaleAndRotateImage:image];
//going to crop the image 9:16 to 2:3;with Width fixed 
float width=scaledimage.size.width; 
float height=scaledimage.size.height; 
float top_adjust=(height-width*3/2.0)/2.0;  
[self setStillImage:[scaledimage croppedImage:rectToCrop]];

source d'informationauteur Cullen SUN | 2012-01-10