私が開発しているアプリケーションでは、カメラでキャプチャしたいオブジェクトのサイズをユーザーに指定させます (たとえば、30" x 40")。次にやりたいことは、cameraOverlayView を上に置いてカメラ フィードを表示することです。そのオブジェクトをキャプチャするのに適切な比率を持つストロークされた透明な正方形だけを表示します。
だから私はこれを機能させるために2つのことを試みました:
を使用する UIViewController を使用しAVCaptureVideoPreviewLayer
て、ライブ ビデオ フィードでビューを表示します。そのフィードの上に、(ユーザーが指定した比率を使用して) 適切な寸法の正方形を描画する透明なビューを表示します。
と
別の試みで、ポップアップするボタンを含む UIViewController を作成しましたUIImagePickerController
。cameraOverlayView
このコントローラーを使用して、プロパティを使用してピッカーにアタッチするビューも作成しました。
これらの両方の方法で私が抱えている主な問題は、実際にキャプチャされた画像が常に画面に表示されるものよりも大きいことですが、写真を撮った後にその画像の一部を切り取る方法が完全にはわかりません.
例: 私の UIImagePickerController が表示され、その上に 300 x 400px の正方形を示すオーバーレイを置きます。ユーザーはこの正方形を使用してオブジェクトの写真を撮り、オブジェクトをこの正方形の中央に配置します。
写真が撮影されますが、320x480 (または 640x960) の写真ではなく、3500x2400 (またはそのようなもの) の結果が得られます。これは、画面の比率とはまったく異なる比率です (もちろん)。
次に、画像の正しい部分を切り取るにはどうすればよいですか。
表示する必要がある正方形のサイズを実際に計算するコード (また、画像のどの部分を切り取るかを決定するために使用する必要があります):
+ (CGRect) getFrameRect:(CGRect) rect forSize:(CGSize) frameSize {
if (CGSizeEqualToSize(frameSize, CGSizeZero))
return CGRectZero;
float maxWidth = rect.size.width - 20;
float maxHeight = rect.size.height - 20;
float ratioX = maxWidth / frameSize.width;
float ratioY = maxHeight / frameSize.height;
float ratio = MIN(ratioX, ratioY);
float newWidth = frameSize.width * ratio;
float newHeight = frameSize.height * ratio;
float x = (rect.size.width - newWidth) / 2;
float y = (rect.size.height - newHeight) / 2;
return CGRectMake(x, y, newWidth, newHeight);
}
これにより、frameSize パラメーターで指定された比率で作成できる最大の正方形が決まります。正方形が描画される寸法は、rect パラメーターで指定されます。
いくつかの解決策が頭に浮かびますが、それが実行可能かどうかはわかりません。
- 写真を画面の幅または高さ (どちらか先に来るもの) に縮小し、写真の中心を取り、それは写真を撮るときに表示される中心と同じですか? これがうまくいくかどうかわからないので、少し試してみましたが、失敗しました。