2014-10-23 1 views
1

에 맞게 보정 : 사용자가 사진을 소요 Live camera feed나는이 같은 중첩 된 영상이 AVLayerVideoGravityResizeAspectFill 높이 차이

를, 이미지가 Captured Still image

내가 전체를 캡처 할 않는 y 축 방향의 오프셋 이미지를 표시하고 사용자가 위아래로 스크롤 할 수있게합니다. 그들은 현재이 작업을 수행 할 수 있지만 카메라 피드 미리보기와 일치하도록 이미지의 시작 스크롤을 중앙에 배치하려고합니다. 따라서 사진을 찍으면 이미지가 비디오 피드가 보여주는 프레임과 일치합니다.

카메라의 화면이 AVLayerVideoGravityResizeAspect로 설정되어 있기 때문에 문제가 발생합니다. 라이브 미리보기에 이미지를 맞추기 위해 '자르기'를하고있는 중입니다. 높이가 너비보다 훨씬 크기 때문에 이미지에 캡처 된 상단 및 하단 부분이 라이브 피드에 나타나지 않습니다 (자연스럽게).

그러나 내가 모르는 것은 상단이 잘려 나간 정도이므로 미리보기 이미지를이 크기에 맞춰 오프셋 할 수 있습니다.

제 궁금한 점은 : 가로 세로 비율 AVLayerVideoGravityResizeAspectFill로 설정된 카메라의 상단에서 얼마나 잘리는 지 계산하는 방법을 알고 있습니까? (목표 - C와 신속한 답변을 환영합니다!)

답변

2

내가 생각 해낸 해결책은 이것이다 : 카메라가 90도 회전하기 때문에

func getVerticalOffsetAdjustment()->CGFloat 
    { 
     var cropRect:CGRect = _videoPreviewLayer.metadataOutputRectOfInterestForRect(_videoPreviewLayer.bounds) //returns the cropped aspect ratio box so you can use its offset position 
     //Because the camera is rotated by 90 degrees, you need to use .x for the actual y value when in portrait mode 
     return cropRect.origin.x/cropRect.width * frame.height 
    } 

그것의 혼란을 나는 인정하지만, 세로 모드에서 당신이 필요할 때 너비와 x 값을 사용하십시오. cropRect는 (0.125,0,0,75,1.0)과 같은 값을 반환합니다 (정확한 값은 다릅니다).

내 시프트 된 y 값 (비디오 라이브 피드가 표시됨)이 전체 높이의 12.5 %로 이동하고 비디오 피드의 높이가 전체 높이의 75 %에 불과하다는 것 .

그래서 정규화 된 (내 UIWindow로) 값을 가져온 다음 스크롤 뷰 오프셋에 적용하기 위해 12.5 %를 나누고 75 %로 나눕니다.

WHEW !!!