2011-03-08 25 views

cevap

24

Evet, bunu yapmanın iki yolu vardır. IOS 3.0 + 'da kullanılabilen bir, showsCameraControls özelliğini NO olarak ayarlayarak ve cameraOverlayView özelliğini kendi özel denetimlerinize ayarlayarak UIImagePickerController sınıfını kullanmaktır. IOS 4.0+ sürümünde kullanılabilen iki model, uygun kamera aygıtını kullanan AVCaptureDeviceInput ve AVCaptureStillImageOutput ile AVCaptureSession yapılandırmasıdır. İlk yaklaşım çok daha basit ve daha fazla iOS sürümü üzerinde çalışıyor, ancak ikinci yaklaşım size fotoğraf çözünürlüğü ve dosya seçenekleri üzerinde çok daha fazla kontrol sağlıyor.

35

DÜZENLEME: Aşağıdaki yorumlarda da belirtildiği gibi, AVCaptureSession'ın nasıl bildirilmesi ve başlatılması gerektiğini açıkça gösterdim. Bir kaçının başlatma işlemini yanlış yaptığı veya AVCaptureSession'ı bir yöntemde yerel değişken olarak bildirdiği görülüyor. Bu işe yaramazdı. kod takiben

kullanıcı girişi olmadan AVCaptureSession kullanarak resim çekmek için izin verir:

// Get all cameras in the application and find the frontal camera. 
AVCaptureDevice *frontalCamera; 
NSArray *allCameras = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo]; 

// Find the frontal camera. 
for (int i = 0; i < allCameras.count; i++) { 
    AVCaptureDevice *camera = [allCameras objectAtIndex:i]; 

    if (camera.position == AVCaptureDevicePositionFront) { 
     frontalCamera = camera; 
    } 
} 

// If we did not find the camera then do not take picture. 
if (frontalCamera != nil) { 
    // Start the process of getting a picture. 
    session = [[AVCaptureSession alloc] init]; 

    // Setup instance of input with frontal camera and add to session. 
    NSError *error; 
    AVCaptureDeviceInput *input = 
    [AVCaptureDeviceInput deviceInputWithDevice:frontalCamera error:&error]; 

    if (!error && [session canAddInput:input]) { 
     // Add frontal camera to this session. 
     [session addInput:input]; 

     // We need to capture still image. 
     AVCaptureStillImageOutput *output = [[AVCaptureStillImageOutput alloc] init]; 

     // Captured image. settings. 
     [output setOutputSettings: 
     [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey,nil]]; 

     if ([session canAddOutput:output]) { 
      [session addOutput:output]; 

      AVCaptureConnection *videoConnection = nil; 
      for (AVCaptureConnection *connection in output.connections) { 
       for (AVCaptureInputPort *port in [connection inputPorts]) { 
        if ([[port mediaType] isEqual:AVMediaTypeVideo]) { 
         videoConnection = connection; 
         break; 
        } 
       } 
       if (videoConnection) { break; } 
      } 

      // Finally take the picture 
      if (videoConnection) { 
       [session startRunning]; 

       [output captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) { 

        if (imageDataSampleBuffer != NULL) { 
         NSData *imageData = [AVCaptureStillImageOutput 
            jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; 
         UIImage *photo = [[UIImage alloc] initWithData:imageData];                 
        } 

       }]; 
      } 
     } 
    } 
} 

seans değişken türü AVCaptureSession ait olup sınıfının .h dosyasında ilan edilmiştir (ya bir özellik olarak veya özel olarak sınıf üyesi):

AVCaptureSession *session; 

Daha sonra sınıfında, örneğin yere başlatılması gerekir init yöntemi:

session = [[AVCaptureSession alloc] init] 
+1

Çok kullanışlı örnek, teşekkürler. – aceofspades

+4

Bu kodu şimdi denedim, hepsi [çıktı captureStillImageAsynchronouslyFromConnection: ... 'çıkışına kadar çalışır, ancak daha sonra durur ve fotoğraf çekilmez. Hemen takip eden çizgiye giriş ekledim ve hiç giriş yapmamıştım. Kod yazdığınız şeydir ve bu noktaya kadar kodu doğruladım (bir düğme ekledim ve .xib'e bağladım, düzgün bir şekilde ateşledim). Ben de AVFoundation.framework ve AssetsLibrary.framework dahil ettik. Herhangi bir fikir? –

+0

Bu satırda bir kesme noktası koydunuz: (imageDataSampleBuffer! = NULL) Vurdu mu? Eğer isabet ederse, NULL değil mi? –

İlgili konular