0

iOSカメラは初めてです。写真(静止画)しか撮れないシンプルなアプリを作ってみました。私はwwdcのコードを使用しています:

https://developer.apple.com/library/ios/samplecode/AVCam/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010112-Intro-DontLinkElementID_2

写真のように、カスタムの写真サイズを作成したい:
ここに画像の説明を入力

しかし、結果は次のとおりです。 ここに画像の説明を入力してください

正方形のサイズに固定するにはどうすればよいですか?

ありがとうございました!

編集: 結果の写真を添付し​​ています。ここに画像の説明を入力してください 。どうすれば修正できますか?

編集2:

CMPCameraViewController:

- (void)viewDidLoad
{
[super viewDidLoad];

// Disable UI. The UI is enabled if and only if the session starts running.
self.stillButton.enabled = NO;

// Create the AVCaptureSession.
self.session = [[AVCaptureSession alloc] init];

// Setup the preview view.
self.previewView.session = self.session;

// Communicate with the session and other session objects on this queue.
self.sessionQueue = dispatch_queue_create( "session queue", DISPATCH_QUEUE_SERIAL );

self.setupResult = AVCamSetupResultSuccess;


// Setup the capture session.
// In general it is not safe to mutate an AVCaptureSession or any of its inputs, outputs, or connections from multiple threads at the same time.
// Why not do all of this on the main queue?
// Because -[AVCaptureSession startRunning] is a blocking call which can take a long time. We dispatch session setup to the sessionQueue
// so that the main queue isn't blocked, which keeps the UI responsive.
dispatch_async( self.sessionQueue, ^{
    if ( self.setupResult != AVCamSetupResultSuccess ) {
        return;
    }

    self.backgroundRecordingID = UIBackgroundTaskInvalid;
    NSError *error = nil;

    AVCaptureDevice *videoDevice = [CMPCameraViewController deviceWithMediaType:AVMediaTypeVideo preferringPosition:AVCaptureDevicePositionBack];
    AVCaptureDeviceInput *videoDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:videoDevice error:&error];

    if ( ! videoDeviceInput ) {
        NSLog( @"Could not create video device input: %@", error );
    }

    [self.session beginConfiguration];

    if ( [self.session canAddInput:videoDeviceInput] ) {
        [self.session addInput:videoDeviceInput];
        self.videoDeviceInput = videoDeviceInput;

        dispatch_async( dispatch_get_main_queue(), ^{
            // Why are we dispatching this to the main queue?
            // Because AVCaptureVideoPreviewLayer is the backing layer for AAPLPreviewView and UIView
            // can only be manipulated on the main thread.
            // Note: As an exception to the above rule, it is not necessary to serialize video orientation changes
            // on the AVCaptureVideoPreviewLayer’s connection with other session manipulation.

            // Use the status bar orientation as the initial video orientation. Subsequent orientation changes are handled by
            // -[viewWillTransitionToSize:withTransitionCoordinator:].
            UIInterfaceOrientation statusBarOrientation = [UIApplication sharedApplication].statusBarOrientation;
            AVCaptureVideoOrientation initialVideoOrientation = AVCaptureVideoOrientationPortrait;
            if ( statusBarOrientation != UIInterfaceOrientationUnknown ) {
                initialVideoOrientation = (AVCaptureVideoOrientation)statusBarOrientation;
            }

            AVCaptureVideoPreviewLayer *previewLayer = (AVCaptureVideoPreviewLayer *)self.previewView.layer;
            previewLayer.connection.videoOrientation = initialVideoOrientation;
            previewLayer.bounds = _previewView.frame;
            //previewLayer.connection.videoOrientation = UIInterfaceOrientationLandscapeLeft;
        } );
    }
    else {
        NSLog( @"Could not add video device input to the session" );
        self.setupResult = AVCamSetupResultSessionConfigurationFailed;
    }

    AVCaptureDevice *audioDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeAudio];
    AVCaptureDeviceInput *audioDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:audioDevice error:&error];

    if ( ! audioDeviceInput ) {
        NSLog( @"Could not create audio device input: %@", error );
    }

    if ( [self.session canAddInput:audioDeviceInput] ) {
        [self.session addInput:audioDeviceInput];
    }
    else {
        NSLog( @"Could not add audio device input to the session" );
    }

    AVCaptureMovieFileOutput *movieFileOutput = [[AVCaptureMovieFileOutput alloc] init];
    if ( [self.session canAddOutput:movieFileOutput] ) {
        [self.session addOutput:movieFileOutput];
        AVCaptureConnection *connection = [movieFileOutput connectionWithMediaType:AVMediaTypeVideo];
        if ( connection.isVideoStabilizationSupported ) {
            connection.preferredVideoStabilizationMode = AVCaptureVideoStabilizationModeAuto;
        }
        self.movieFileOutput = movieFileOutput;
    }
    else {
        NSLog( @"Could not add movie file output to the session" );
        self.setupResult = AVCamSetupResultSessionConfigurationFailed;
    }

    AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
    if ( [self.session canAddOutput:stillImageOutput] ) {
        stillImageOutput.outputSettings = @{AVVideoCodecKey : AVVideoCodecJPEG};
        [self.session addOutput:stillImageOutput];
        self.stillImageOutput = stillImageOutput;
    }
    else {
        NSLog( @"Could not add still image output to the session" );
        self.setupResult = AVCamSetupResultSessionConfigurationFailed;
    }

    [self.session commitConfiguration];
} );    
}

CMPPreviewView:

 + (Class)layerClass
   {
   return [AVCaptureVideoPreviewLayer class];
   }

 - (AVCaptureSession *)session
 {
AVCaptureVideoPreviewLayer *previewLayer = (AVCaptureVideoPreviewLayer *)self.layer;
return previewLayer.session;
}

- (void)setSession:(AVCaptureSession *)session
{
AVCaptureVideoPreviewLayer *previewLayer = (AVCaptureVideoPreviewLayer *)self.layer;
previewLayer.session = session;
((AVPlayerLayer *)[self layer]).videoGravity = AVLayerVideoGravityResize;
   }
4

1 に答える 1

0

Apple の AVCam コードは、写真の開発に取り掛かるための優れた出発点です。

あなたがしようとしているのは、ビデオ プレビュー レイヤーのサイズを変更することです。これは、videoGravity 設定を変更することによって行われます。以下は、アスペクト フィル タイプの表示の例です。

[Swift 3]

previewView.videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill

ここで、長方形に塗りつぶす状況では、レイヤーの境界を定義してから を使用する必要がありますAVLayerVideoGravityResize

注意:これは、キャプチャされた写真のサイズには影響しません。ビデオ プレビュー レイヤーのサイズを変更するだけです。これは重要な違いです。キャプチャした写真のサイズを変更するには、トリミング操作を実行する必要があります (さまざまな方法でかなり簡単に実行できます) が、それはあなたの意図ではないようです。

幸運を祈ります。

編集:さて、キャプチャした UIImage のトリミングに興味があるようです。

[Swift 3] 
// I'm going to assume you've done something like this to store the captured data to a UIImage object 
//If not, I would do so
let myImage = UIImage(data: capturedImageData)! 

// using core graphics (the cg in cgImage) you can perform all kinds of image manipulations--crop, rotation, mirror, etc. 
// here's crop to a rectangle--fill in with your desired values 
let myRect = CGRect(x: ..., y: ..., width: ..., height: ...) 
myImage = myImage.cgImage?.cropping(to: myRect)

うまくいけば、これはあなたの質問に答えます。

于 2016-08-16T01:38:42.803 に答える