Как активировать Портретные эффекты, используя данные глубины в iOS 12 - PullRequest
0 голосов
/ 23 октября 2018

Я начал с этого кода: сеанс 507 WWDC 2017

ПОЛНОСТЬЮ РЕДАКТИРОВАНО

В iOS-камере Roll можно активировать «Портретный эффект»во время редактирования изображения, взятого из моего приложения.Теперь я хочу узнать, как я могу напрямую сохранить изображение с уже активированным этим эффектом?

Я думаю, что мой код правильный, потому что я могу сохранить метаданные глубины.

Я активирую bool в сеансеконфигурация

self.photoOutput.depthDataDeliveryEnabled = YES;

и в сеансе захвата вывода я обновляю настройки:

photoSettings.depthDataDeliveryEnabled = self.photoOutput.isDepthDataDeliveryEnabled;

, и это в моем делегате:

- (void)captureOutput:(AVCapturePhotoOutput *)captureOutput didFinishProcessingPhoto:(AVCapturePhoto *)photo error:(nullable NSError *)error
{
    if ( error != nil ) {
        NSLog( @"Error capturing photo: %@", error );
        return;
    }

    self.photoData = [photo fileDataRepresentation];

}

но я не понимаю, почему в рулоне системной камеры у меня нет «портретного значка», но он появляется только во время редактирования:

enter image description here

ОБНОВЛЕНИЕ 1

Это метод, который я использую для сохранения фотографии:

- (void)captureOutput:(AVCapturePhotoOutput *)captureOutput didFinishCaptureForResolvedSettings:(AVCaptureResolvedPhotoSettings *)resolvedSettings error:(NSError *)error
{
    if ( error != nil ) {
        NSLog( @"Error capturing photo: %@", error );
        [self didFinish];
        return;
    }

    if ( self.photoData == nil ) {
        NSLog( @"No photo data resource" );
        [self didFinish];
        return;
    }

    [PHPhotoLibrary requestAuthorization:^( PHAuthorizationStatus status ) {
        if ( status == PHAuthorizationStatusAuthorized ) {
            [[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{

                PHAssetResourceCreationOptions *options = [[PHAssetResourceCreationOptions alloc] init];
                options.uniformTypeIdentifier = self.requestedPhotoSettings.processedFileType;

                PHAssetCreationRequest *creationRequest = [PHAssetCreationRequest creationRequestForAsset];
                [creationRequest addResourceWithType:PHAssetResourceTypePhoto data:self.photoData options:options];

                if ( self.livePhotoCompanionMovieURL ) {

                    PHAssetResourceCreationOptions *livePhotoCompanionMovieResourceOptions = [[PHAssetResourceCreationOptions alloc] init];
                    livePhotoCompanionMovieResourceOptions.shouldMoveFile = YES;
                    [creationRequest addResourceWithType:PHAssetResourceTypePairedVideo fileURL:self.livePhotoCompanionMovieURL options:livePhotoCompanionMovieResourceOptions];

                }

            } completionHandler:^( BOOL success, NSError * _Nullable error ) {
                if ( ! success ) {
                    NSLog( @"Error occurred while saving photo to photo library: %@", error );
                }

                [self didFinish];
            }];
        }
        else {
            NSLog( @"Not authorized to save photo" );
            [self didFinish];
        }
    }];
}

Так как я могу сохранить свою фотографию с помощьюэффект портрета активирован?

Большое спасибо

1 Ответ

0 голосов
/ 23 октября 2018

Вам нужно использовать формат HEIF, а не JPEG.Запишите это с данными глубины в параметре 'option'.https://developer.apple.com/documentation/coreimage/cicontext/2902269-heifrepresentation

ОБНОВЛЕНИЕ : По-видимому, также можно предоставить данные глубины в параметре 'option' для JPEG!- https://developer.apple.com/documentation/coreimage/cicontext/1642214-jpegrepresentation

ОБНОВЛЕНИЕ № 2 : Я совершенно неправильно понял ваш вопрос!Ваша проблема может быть решена путем создания CGImage из CIImage сначала, то есть let cgImage = context.createCGImage(ciImage, from: ciImage.extent) (в Swift), где context является экземпляром CIContext .

ОБНОВЛЕНИЕ # 3 (для отредактированного вопроса): я предполагаю, что это связано с отсутствием photoDepthEffect: PHAssetMediaSubtype (https://developer.apple.com/documentation/photokit/phassetmediasubtype/2765283-photodeptheffect), которое вы можете установить на PHAsset через PHAssetChangeRequest.

...