Сохранить CIImage, преобразовав в CGImage, выдает ошибку

У меня есть изображение, которое я беру из AVFoundation:

[stillImage captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) {
    NSLog(@"image capture");

    NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
    UIImage *image = [[UIImage alloc] initWithData:imageData];

Затем я обрезаю это изображение, сначала конвертируя его в CIImage:

beginImage = [CIImage imageWithCVPixelBuffer:CMSampleBufferGetImageBuffer(imageSampleBuffer) options:[NSDictionary dictionaryWithObjectsAndKeys:[NSNull null], kCIImageColorSpace, nil]];

    //first we crop to a square
    crop = [CIFilter filterWithName:@"CICrop"];
    [crop setValue:[CIVector vectorWithX:0 Y:0 Z:70 W:70] forKey:@"inputRectangle"];
    [crop setValue:beginImage forKey:@"inputImage"];
    croppedColourImage = [crop valueForKey:@"outputImage"];

Затем я пытаюсь преобразовать это обратно в CGImage, чтобы сохранить его:

CGImageRef cropColourImage = [context createCGImage:croppedColourImage fromRect:[croppedColourImage extent]];
    UIImage *cropSaveImage = [UIImage imageWithCGImage:cropColourImage];


    //saving of the images
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

     [library writeImageToSavedPhotosAlbum:[cropSaveImage CGImage] orientation:(ALAssetOrientation)[image imageOrientation] completionBlock:^(NSURL *assetURL, NSError *error){
     if (error) {
         NSLog(@"ERROR in image save :%@", error);
     } else
     {
         NSLog(@"SUCCESS in image save");
     }

     }];

Однако это вызывает ошибку:

ОШИБКА при сохранении изображения: Error Domain = ALAssetsLibraryErrorDomain Code = -3304 «Не удалось закодировать изображение для сохраненных фотографий». UserInfo = 0x19fbd0 {NSUnderlyingError = 0x18efa0 «Не удалось закодировать изображение для сохраненных фотографий.», NSLocalizedDescription = Не удалось кодировать изображение для сохраненных фотографий.}

Я читал в другом месте, что это может произойти, если изображение было 0x0 пикселей, и что преобразование из CIImage в CGImage может вызвать проблему. Любые идеи?

Спасибо.


person mrEmpty    schedule 04.05.2012    source источник
comment
Я считаю, что это связано с тем, что изображение, которое я пытаюсь сохранить, не имеет размеров, ширина и высота кажутся равными нулю. 2012-05-06 14: 39: 22.886 zApp [5108: 707] Ширина сохраняемого изображения: (null) 2012-05-06 14: 39: 22.890 zApp [5108: 707] Высота сохраняемого изображения: ( нулевой)   -  person mrEmpty    schedule 06.05.2012
comment
У меня была ошибка в моем коде NSLog, я могу подтвердить, что изображение, которое я пытаюсь сохранить, имеет размер 0x0 пикселей. Так что я думаю, что это проблема, но я не понимаю, что бы это могло происходить.   -  person mrEmpty    schedule 06.05.2012


Ответы (1)


У меня все заработало!

Я заменил весь свой код на:

NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer];
UIImage *image = [[UIImage alloc] initWithData:imageData];
NSLog(@"*image size is: %@", NSStringFromCGSize(image.size));

//test creating a new ciimage
CIImage *ciImage = [[CIImage alloc] initWithCGImage:[image CGImage]];
NSLog(@"ciImage extent: %@", NSStringFromCGRect([ciImage extent]));

Это дает мне полезный CIImage. Затем я могу поиграть с фильтром, прежде чем сохранять его с помощью:

CIImage *croppedColourImage = [crop outputImage];

//convert it to a cgimage for saving
CGImageRef cropColourImage = [context createCGImage:croppedColourImage fromRect:[croppedColourImage extent]];

//saving of the images
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];

[library writeImageToSavedPhotosAlbum:cropColourImage metadata:[croppedColourImage properties] completionBlock:^(NSURL *assetURL, NSError *error){
    if (error) {
        NSLog(@"ERROR in image save: %@", error);
    } else
    {
        NSLog(@"SUCCESS in image save");
        CGImageRelease(cropColourImage);
    }
}];
person mrEmpty    schedule 06.05.2012