2014-12-11 1 views
2

나는 이것이 이전에 물어 보았다는 것을 안다. 나는이 질문에 대한 모든 답을 여기서 시도했다. 나는 그것에 대해 근본적으로 뭔가 있다고 생각한다. 지금까지 내 노력이 결실을 맺지 못함을 이해합니다. 나는 누군가가 나를이 고투에 대한 바보처럼 느끼게하고 올바른 방향으로 나를 가리킬 수 있기를 바라고 있습니다.AVFoundation Image Capture - 캡처 UIImage에서 사용자가 보는 것 정확히

내가하려는 것은 AVCaptureSession으로 사각형 UIImage를 캡처하여 비디오 레이어의 영역과 똑같이 보이는 축소판 이미지보기로 표시하는 것입니다. 이미지 캡처는 정상적으로 작동하지만 이미지가 축소판 이미지보기에 추가되면 이미지의 위쪽과 아래쪽이 확장되어 사용자가 볼 수있는 AvCaptureVideoPreviewLayer에없는 사진 영역을 표시합니다.

은 다음 코드는 모든 작품, 내 세션을 초기화한다하지만 어쩌면 내가 사용자에게 표시 공급의 부분 만 캡처하려면 여기를 변경해야하는 무언가가있다 :

-(void)setupFeed 
{ 
    self.session = [[AVCaptureSession alloc] init]; 

    self.session.sessionPreset = AVCaptureSessionPresetPhoto; 
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 
    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil]; 
    if([self.session canAddInput:deviceInput]) 
    { 
     [self.session addInput:deviceInput]; 
    } 

    self.cameraPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.session]; 
    [self.cameraPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; 
    CALayer *rootLayer = [[self view] layer]; 
    [rootLayer setMasksToBounds:YES]; 
    CGRect frame = self.cameraPreview.frame; 
    [self.cameraPreviewLayer setFrame:frame]; 
    [rootLayer insertSublayer:self.cameraPreviewLayer atIndex:0]; 

    self.imageOutput = [[AVCaptureStillImageOutput alloc] init]; 
    NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG, AVVideoCodecKey, nil]; 
    [self.imageOutput setOutputSettings:outputSettings]; 

    [self.session addOutput:self.imageOutput]; 

    [self.session startRunning]; 
} 

코드의 다음 비트가이다 내 이미지를 캡처,이 코드는 따로 자르기, 작동 :

[self.imageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) 
    { 

     if(imageDataSampleBuffer != NULL) 
     { 
      NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer]; 
      self.snappedImage = [UIImage imageWithData:imageData]; 
      [self.snappedImage crop:self.snappedImageView.layer.frame]; 
      [self.session stopRunning];; 
     } 

     dispatch_async(dispatch_get_main_queue(), 
     ^{ 
      [self presentSnappedImageOptions]; 
     }); 
    }]; 
} 

-(void)presentSnappedImageOptions 
{ 
    [self.imagePreview setImage: self.snappedImage]; 
} 

... 그리고 마지막으로 내가 보이는 비디오 레이어과 동일하게 이미지를 잘라을 시도 사용하고있어있는 UIImage 카테고리 방법 :

@implementation UIImage (Crop) 

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

    rect = CGRectMake(rect.origin.x*self.scale, 
         rect.origin.y*self.scale, 
         rect.size.width*self.scale, 
         rect.size.height*self.scale); 

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

@end 

도움이 될 것입니다.

답변

1

내보기가 어떻게 레이아웃되어 있는지 잘 모르겠지만 사용중인 자르기 부분이 "self.snappedImageView.layer.frame"은 미리보기 레이어에 표시된 캡처 된 이미지의 영역과 일치하지 않습니다. .

미리보기 레이어의 프레임이 제곱 된 것을 알았으므로 비디오 중력이 측면 채워지기 때문에 이미지의 가장 가운데에있는 사각형을 가져 와서 잘라내 기 직사각형으로 사용할 수 있다고 생각합니다. 이 RECT

CGSize size = image.size; 
CGFloat side = fminf(size.width,size.height); //just the smaller dimension 
CGrect croppingRect = CGRectMake((size.width-side)/2.f,(size.height-side)/2.f,side,side); 
+0

시도에 대해 어떻게

이 좀 도와 시간을내어 주셔서 감사합니다. 당신의 코드는 내가 필요로하는 GCRect를 주었고, 나는 원하는 결과를 얻기 위해 다른 자르기 방법을 사용해야 만했다. 같은 일로 고생하는 사람들을 위해 내가 사용한 자르기 방법은 - (UIImage *) croppIngimageByImageName : (UIImage *) imageToCrop toRect : (CGRect) rect, 여기 iPatel에서 게시 http://stackoverflow.com/questions/18205672/how - 투 - 작물 - 이미지 - 객관적 - c. –