2016-08-15 1 views
0

Это мой первый раз с камерой iOS. Я пытаюсь создать простое приложение, которое может принимать только фотографии (неподвижное изображение). Я использую код из WWDC:AVCam Customize PreviewLayer

https://developer.apple.com/library/ios/samplecode/AVCam/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010112-Intro-DontLinkElementID_2 

Я хочу, чтобы создать пользовательский размер фотографий, как на картинке:
введите описание изображения здесь

Но результат: enter image description here

Как я могу исправить это до размера квадрата?

Спасибо!

Редактировать: У меня есть изображение результата. enter image description here как я могу это исправить?

Эдита 2:

CMPCameraViewController:

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

// Disable UI. The UI is enabled if and only if the session starts running. 
self.stillButton.enabled = NO; 

// Create the AVCaptureSession. 
self.session = [[AVCaptureSession alloc] init]; 

// Setup the preview view. 
self.previewView.session = self.session; 

// Communicate with the session and other session objects on this queue. 
self.sessionQueue = dispatch_queue_create("session queue", DISPATCH_QUEUE_SERIAL); 

self.setupResult = AVCamSetupResultSuccess; 


// Setup the capture session. 
// In general it is not safe to mutate an AVCaptureSession or any of its inputs, outputs, or connections from multiple threads at the same time. 
// Why not do all of this on the main queue? 
// Because -[AVCaptureSession startRunning] is a blocking call which can take a long time. We dispatch session setup to the sessionQueue 
// so that the main queue isn't blocked, which keeps the UI responsive. 
dispatch_async(self.sessionQueue, ^{ 
    if (self.setupResult != AVCamSetupResultSuccess) { 
     return; 
    } 

    self.backgroundRecordingID = UIBackgroundTaskInvalid; 
    NSError *error = nil; 

    AVCaptureDevice *videoDevice = [CMPCameraViewController deviceWithMediaType:AVMediaTypeVideo preferringPosition:AVCaptureDevicePositionBack]; 
    AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error]; 

    if (! videoDeviceInput) { 
     NSLog(@"Could not create video device input: %@", error); 
    } 

    [self.session beginConfiguration]; 

    if ([self.session canAddInput:videoDeviceInput]) { 
     [self.session addInput:videoDeviceInput]; 
     self.videoDeviceInput = videoDeviceInput; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      // Why are we dispatching this to the main queue? 
      // Because AVCaptureVideoPreviewLayer is the backing layer for AAPLPreviewView and UIView 
      // can only be manipulated on the main thread. 
      // Note: As an exception to the above rule, it is not necessary to serialize video orientation changes 
      // on the AVCaptureVideoPreviewLayer’s connection with other session manipulation. 

      // Use the status bar orientation as the initial video orientation. Subsequent orientation changes are handled by 
      // -[viewWillTransitionToSize:withTransitionCoordinator:]. 
      UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation; 
      AVCaptureVideoOrientation initialVideoOrientation = AVCaptureVideoOrientationPortrait; 
      if (statusBarOrientation != UIInterfaceOrientationUnknown) { 
       initialVideoOrientation = (AVCaptureVideoOrientation)statusBarOrientation; 
      } 

      AVCaptureVideoPreviewLayer *previewLayer = (AVCaptureVideoPreviewLayer *)self.previewView.layer; 
      previewLayer.connection.videoOrientation = initialVideoOrientation; 
      previewLayer.bounds = _previewView.frame; 
      //previewLayer.connection.videoOrientation = UIInterfaceOrientationLandscapeLeft; 
     }); 
    } 
    else { 
     NSLog(@"Could not add video device input to the session"); 
     self.setupResult = AVCamSetupResultSessionConfigurationFailed; 
    } 

    AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio]; 
    AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error]; 

    if (! audioDeviceInput) { 
     NSLog(@"Could not create audio device input: %@", error); 
    } 

    if ([self.session canAddInput:audioDeviceInput]) { 
     [self.session addInput:audioDeviceInput]; 
    } 
    else { 
     NSLog(@"Could not add audio device input to the session"); 
    } 

    AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init]; 
    if ([self.session canAddOutput:movieFileOutput]) { 
     [self.session addOutput:movieFileOutput]; 
     AVCaptureConnection *connection = [movieFileOutput connectionWithMediaType:AVMediaTypeVideo]; 
     if (connection.isVideoStabilizationSupported) { 
      connection.preferredVideoStabilizationMode = AVCaptureVideoStabilizationModeAuto; 
     } 
     self.movieFileOutput = movieFileOutput; 
    } 
    else { 
     NSLog(@"Could not add movie file output to the session"); 
     self.setupResult = AVCamSetupResultSessionConfigurationFailed; 
    } 

    AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; 
    if ([self.session canAddOutput:stillImageOutput]) { 
     stillImageOutput.outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG}; 
     [self.session addOutput:stillImageOutput]; 
     self.stillImageOutput = stillImageOutput; 
    } 
    else { 
     NSLog(@"Could not add still image output to the session"); 
     self.setupResult = AVCamSetupResultSessionConfigurationFailed; 
    } 

    [self.session commitConfiguration]; 
});  
} 

CMPPreviewView:

+ (Class)layerClass 
    { 
    return [AVCaptureVideoPreviewLayer class]; 
    } 

- (AVCaptureSession *)session 
{ 
AVCaptureVideoPreviewLayer *previewLayer = (AVCaptureVideoPreviewLayer *)self.layer; 
return previewLayer.session; 
} 

- (void)setSession:(AVCaptureSession *)session 
{ 
AVCaptureVideoPreviewLayer *previewLayer = (AVCaptureVideoPreviewLayer *)self.layer; 
previewLayer.session = session; 
((AVPlayerLayer *)[self layer]).videoGravity = AVLayerVideoGravityResize; 
    } 

ответ

0

AVCam код компания Apple является отличной отправной точкой для получения в развитие фотографии.

Что вы пытаетесь сделать, это изменить размер слоя предварительного просмотра видео. Это делается путем изменения настройки videoGravity. Вот пример для просмотра типа заливки аспекта:

[Swift 3] 

previewView.videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 

Теперь для вашей ситуации заполнения прямоугольника вы обязаны определить границы слоя используйте AVLayerVideoGravityResize.

Обращаем ваше внимание: Это не повлияет на размер снятой фотографии. Он просто изменяет размер слоя предварительного просмотра видео. Это важное различие. Для изменения размера захваченной фотографии вам необходимо выполнить операцию обрезки (что можно сделать довольно легко с различными способами), но, похоже, это не ваше намерение.

Удачи.

Редактировать: Теперь, кажется, вам интересно обрезать захваченный UIImage.

[Swift 3] 
// I'm going to assume you've done something like this to store the captured data to a UIImage object 
//If not, I would do so 
let myImage = UIImage(data: capturedImageData)! 

// using core graphics (the cg in cgImage) you can perform all kinds of image manipulations--crop, rotation, mirror, etc. 
// here's crop to a rectangle--fill in with your desired values 
let myRect = CGRect(x: ..., y: ..., width: ..., height: ...) 
myImage = myImage.cgImage?.cropping(to: myRect) 

Надеюсь, это отвечает на ваш вопрос.

+0

Спасибо Я попробую. , и я буду читать об обрезке, потому что мне тоже нужно. –

+0

вы можете увидеть мое редактирование? Спасибо! –

+0

Эй, там. Я думаю, что возможно, я не понял ваш первоначальный вопрос, поэтому позвольте мне занять секунду, чтобы уточнить с вами. Вы пытаетесь сделать слой ** предварительного просмотра ** (что вы видите перед тем, как сделать снимок) заполнить размер квадрата? В качестве альтернативы, вы пытаетесь обрезать ** захваченную ** фотографию размером с этот квадрат?Я предположил, что мы говорим о слое предварительного просмотра видео, который действительно требует регулировки гравитации видео. Пожалуйста, также включите код, который вы пытались выполнить, и я вижу, что вы пробовали. –