0

Je souhaite prendre une photo avec une image de superposition.Capture de superposition à l'aide de l'infrastructure AVFoundation

code:

- (void)addStillImageOutput 
{ 

    // NSLog(@"You capture image"); 
    [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]; 
                 }]; 


} 

OverlayImage:

-(void)ButtonPressed1{ 

UIImageView *overlayImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"sof.png"]]; 
    [overlayImageView setFrame:CGRectMake(30, 100, 260, 200)]; 


    [[self view] addSubview:overlayImageView]; 
    [overlayImageView release]; 
} 

Répondre

2

captureStillImageAsynchronouslyFromConnection capture uniquement les données de connexion (AVCaptureConnection) et les images supplémentaires ne sont pas dans le cadre. Ils sont dans la vue.

Ainsi, pour « générer » une image avec tous les éléments (image et superposition), vous devez faire quelque chose comme ceci:

UIGraphicsBeginImageContext(stillImage.size); 

[stillImage drawInRect:CGRectMake(0, 0, picture.size.width, picture.size.height)]; 
[overlayImageView drawInRect:CGRectMake(overlayImageView.frame.origin.x, overlayImageView.frame.origin.y, overlayImageView.frame.size.width, overlayImageView.frame.size.height)]; 

UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

Ce code envisage que la taille de l'image est égale à la taille de l'écran. Si la taille de l'image est différente, vous devez calculer les coordonnées pour placer la superposition dans la méthode drawRect. Désolé pour mon mauvais anglais.

+0

Où puis-je ajouter ce code? – Ram

+0

Vous pouvez ajouter l'observateur '[[NSNotificationCenter defaultCenter] addObserver: auto-sélecteur: @selector (processImage) nom: kImageCapturedSuccessfully objet: nil];' on '- (void) viewDidLoad' et sur' - (void) processImage' vous ajoutez le code ci-dessus. – djserva

+0

Je dois prendre l'image de superposition avec la position nouvellement déplacée. Je définis le cadre drawInRect. Mais quand je déplace l'image de la position par défaut à une autre position, alors je veux prendre la photo avec la position nouvellement déplacée avec l'image de recouvrement ... Mais j'ai eu seulement l'image de superposition de taille d'image par défaut. Comment puis-je obtenir le cadre de la position de déplacement? – Ram

Questions connexes