2017-02-03 5 views
1

Я использую Avfoundation для захвата видео, и я хотел бы обрезать одну часть захваченного UIImage. Я использую два UIImageView. layoutiOS урожай одной части UIImage

Вот мой код для создания представления.

-(void)addCamToView 
    { 
     AVCaptureSession *session = [[AVCaptureSession alloc]init]; 
     session.sessionPreset = AVCaptureSessionPresetPhoto; 

     AVCaptureDevice *device = 
     [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
     AVCaptureDeviceInput *input = [AVCaptureDeviceInput  deviceInputWithDevice:device error:nil]; 

    [session addInput:input]; 
    AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init]; 
    _stillImageOutput = [[AVCaptureStillImageOutput alloc]init]; 
    [session addOutput:output]; 
    [session addOutput:_stillImageOutput]; 
    output.videoSettings = 
    @{ (NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA) }; 
    AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 
    previewLayer.frame = _imv1.bounds; 
    previewLayer.videoGravity = AVLayerVideoGravityResize; 

    CALayer *ca_imv2 = _imv2.layer; 
    CALayer *ca_mainImv = _imv1.layer; 

    [previewLayer addSublayer:ca_mainImv]; 
    [previewLayer addSublayer:ca_imv2]; 

    [self.view.layer addSublayer:previewLayer]; 

    [session startRunning]; 
} 

Когда пользователь нажимает на кнопку захвата Я бегу этот код для захвата изображения:

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

      if (videoConnection) { break; } 
     } 
     [_stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer,NSError *error) 
      { 
       NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; 
       UIImage *image = [[UIImage alloc] initWithData:imageData]; 

       UIImage *croppedImv = [self crop:imv2.frame: image]; 

       self.imv1.image = croppedImv; 
      }]; 
} 

Вот мой код, чтобы обрезать изображение. Я хотел бы, чтобы извлечь часть изображения в UIImageView2

- (UIImage *)crop:(CGRect)rect :(UIImage *)img { 

    CGImageRef imageRef = CGImageCreateWithImageInRect(img.CGImage, rect); 
    UIImage *result = [UIImage imageWithCGImage:imageRef scale:img.scale orientation: img.imageOrientation]; 
    CGImageRelease(imageRef); 
    return result; 
} 

По какой-то причине обрезанное изображение никогда не является изображение в UIImageView2. Я что-то упускаю?

Thanks

ответ

0

Позвольте мне посмотреть, получил ли я это.
Вы хотите отобразить свое изображение в большом представлении изображения, затем вы хотите вырезать часть этого изображения и показать его в виде лупы.
В данный момент вы видите другой прямоугольник вашего большого изображения внутри изображения 2, это правильно?
я полагаю, что проблема связана с просмотром изображений 1 режима контента (и или режим просмотра содержимых изображений.

вид изображения использует его свойство contentMode и конфигурацию самого изображение, чтобы определить, как отображать изображение. Лучше всего указать изображения, размеры которых соответствуют размерам изображения , но изображения могут масштабировать ваши изображения, чтобы соответствовать всем или некоторым из доступному пространству. Если размер самого изображения изменяется, он автоматически масштабирует изображение по мере необходимости.

Другой проблемой может быть кадр, который вы используете для обрезки изображения, потому что рамка представления представляет координату представления относительно своего супервизора.
В вашем случае это совпадение может быть правильным только в том случае, если изображение 1 занимает все границы своего наблюдения и имеет один и тот же вид сверху с изображением. 2.

+0

Спасибо andrea за ваш ответ. Это именно то, что я пытаюсь сделать. Моя конечная цель - сделать некоторые операции с захваченным изображением в imageView2. Я показываю его в imageView1, чтобы быть уверенным, что я обрезал правый раздел. Imageview1 является родительским элементом imageView2, а imageView1 - подвид главного UIView и имеет тот же фрейм, что и основной UIView. Как я могу получить правильную координату UIimageView2, чтобы иметь возможность обрезать изображение? – armand

+0

Добавление subview в uiimageview невозможно в построителе интерфейса только в коде. Вы создаете свой интерфейс в построителе интерфейса или коде? – Andrea

+0

Я создаю интерфейс в коде. Я изменил код, чтобы добавить imv2 в previewLayer следующим образом: CALayer * ca_imv2 = _imv2.layer; CALayer * ca_imv1 = _imv1.layer; [previewLayer addSublayer: ca_imv1]; [previewLayer addSublayer: ca_imv2]; и у меня такая же проблема, как вы были правы, проблема связана, вероятно, потому, что если я добавлю: _imv2.center = _imv1.center; imv2 не находится в центре imv1, но я не понимаю, что я делаю неправильно, я думаю, что я чего-то не хватает. Спасибо – armand

 Смежные вопросы

  • Нет связанных вопросов^_^