2011-08-11 1 views
2

내 질문이 하나 대부분 비슷합니다AVFoundation 작물은 미리보기 화면 비율에 따라 정지 영상을 캡처

Cropping image captured by AVCaptureSession

나는 아직도 이미지를 캡처 AVFoundation를 사용하는 응용 프로그램이 있습니다. 내 AVCaptureVideoPreviewLayer는 AVLayerVideoGravityResizeAspectFill 비디오 중력을 가지므로 미리보기 화면을 만들어 사용자가 위에서 아래로 자른 것처럼 보입니다.

"캡처"버튼을 누르면 실제 캡처 한 이미지가 사용자에게 보여지는 미리보기 이미지와 다릅니다. 내 질문에 따라 캡처 한 이미지를 자르는 법이 무엇입니까?

미리 감사드립니다.

+0

캡쳐 된 이미지는 가로 채우기 용으로 크기를 조정하기 때문에 미리보기 이미지와 다릅니다. 맞습니까? 그래서 대신 속성을 'AVLayerVideoGravityResizeAspect'로 변경하거나 미리보기 레이어의 크기를 캡처 이미지의 비율과 일치하도록 조정하지 않으시겠습니까? – MiguelB

+0

문제점의 해결책을 찾으셨습니까? – Dejell

답변

0

나는 here에 제공된 UIImage+Resize 카테고리를 사용했다. 나는이 일을하기 위해 몇 가지 새로운 방법을 사용했다. 더 잘 보이고 테스트되지 않는 코드를 다시 포맷했지만 작동해야합니다. :)

- (UIImage*)cropAndResizeAspectFillWithSize:(CGSize)targetSize 
         interpolationQuality:(CGInterpolationQuality)quality { 

    UIImage *outputImage = nil; 
    UIImage *imageForProcessing = self; 

    // crop center square (AspectFill) 
    if (self.size.width != self.size.height) { 
     CGFloat shorterLength = 0; 
     CGPoint origin = CGPointZero; 
     if (self.size.width > self.size.height) { 
      origin.x = (self.size.width - self.size.height)/2; 
      shorterLength = self.size.height; 
     } 
     else { 
      origin.y = (self.size.height - self.size.width)/2; 
      shorterLength = self.size.width; 
     } 
     imageForProcessing = [imageForProcessing normalizedImage]; 
     imageForProcessing = [imageForProcessing croppedImage:CGRectMake(origin.x, origin.y, shorterLength, shorterLength)]; 
    } 
    outputImage = [imageForProcessing resizedImage:targetSize interpolationQuality:quality]; 
    return outputImage; 
} 

// fix image orientation, which may wrongly rotate the output. 
- (UIImage *)normalizedImage { 
    if (self.imageOrientation == UIImageOrientationUp) return self; 

    UIGraphicsBeginImageContextWithOptions(self.size, NO, self.scale); 
    [self drawInRect:(CGRect){0, 0, self.size}]; 
    UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return normalizedImage; 
} 
+0

이 방법을 사용하면 이미지를자를 수 있습니까? – Dejell

+0

주어진 이미지의 크기를 조정하지만 자르지는 않습니다. – Dejell

+0

맞습니다. 나는 그것을 깨달았지만 나의 대답을 고치는 것을 잊었다. 잠시 후 할거야;) – Hlung