2012-05-12 8 views
0

Я получаю сообщение об ошибке в коде, который два дня назад работал нормально. Ошибка:Ошибка NSInvalidArgument - CGImageRef от CIImage

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType extent]: unrecognized selector sent to instance 0x1bc8f0' 

он указывает на этой линии на main.m:

return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 

Использование журналов, чтобы увидеть, где мой код попадает в него, кажется, эта линия бросает ошибку:

greySave = [context createCGImage:greyscaleImage fromRect:[greyscaleImage extent]]; 

greySave - это CGImageRef, объявленный в начале моего контроллера представления. Это просто захват выход CIImage и преобразования его в CGImageRef для сохранения:

desaturate = [CIFilter filterWithName:@"CIColorMonochrome" keysAndValues:kCIInputImageKey, colourSave, @"inputIntensity", [NSNumber numberWithFloat:0.00], nil]; 


greyscaleImage = [desaturate valueForKey:@"outputImage"]; 


greySave = [context createCGImage:greyscaleImage fromRect:[greyscaleImage extent]]; 

Единственное, что я изменился, что я думаю (хотя не понимаю, почему) может быть причиной проблемы является добавление дополнительного условного оператора, который будет применять второй фильтр, пользователь желает сделать это:

if ([_alphaButtonSavedState isEqualToString:@"ON"]) { 
      NSLog(@"user does want alpha on greyscale"); 
      //user wants alpha mask also 
     } else { 
      NSLog(@"user does not want alpha on greyscale"); 
      //convert to CGImage for saving 
      greySave = [context createCGImage:greyscaleImage fromRect:[greyscaleImage extent]]; 
      NSLog(@"greySave cgimage created"); 

      //save the grey image 
      [library writeImageToSavedPhotosAlbum:greySave metadata:[greyscaleImage properties] completionBlock:^(NSURL *assetURL, NSError *error){ 
       if (error) { 
        NSLog(@"ERROR in greyscale save: %@", error); 
       } else 
       { 
        NSLog(@"SUCCESS in greyscale save"); 
        //in here we'll put a nice animation or something 
        //CGImageRelease(greyscaleImage); 
       } 
      }]; 

Любые идеи, почему это происходит?

Спасибо.

EDIT:

Вот весь фрагмент кода, только в случае, если это помогает.

[stillImage captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) { 

    NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; //get the raw image data from the session 
    UIImage *startImage = [[UIImage alloc] initWithData:imageData]; //create a UIImage from that image data, let's us work with it 

    //resizing of image to take place before anything else 
    UIImage *image = [UIImage imageWithImage:startImage scaledToSize:_exportSSize]; //scale the image so it's shortest side is the size given in prefs 

    NSLog(@"image width post scale: %g", image.size.width); 
    NSLog(@"image height post scale is: %g", image.size.height); 

    //change the context to render using cpu, so on app exit renders get completed 
    context = [CIContext contextWithOptions: [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:kCIContextUseSoftwareRenderer]]; 

    //new crop testing - not using CIImage - seems to work, just need to sort out crop region 
    CGRect cropRect = CGRectMake(0, 0, _exportSize, _exportSize); 
    UIImage *cropper = [self imageByCropping:image toRect:cropRect]; 

    //the colour image is always saved so create a CGImage to save later 
    colourSave = [cropper CGImage]; 
    NSLog(@"coloursave image created"); 

    //now we convert and create CGImages based upon chosen export options 
    if ([_greyButtonSavedState isEqualToString:@"ON"]) { 
     NSLog(@"inside the greyscale conditional"); 
     //user wants greyscale image 
     //create a CIMonochrome filter 
     desaturate = [CIFilter filterWithName:@"CIColorMonochrome" keysAndValues:kCIInputImageKey, colourSave, @"inputIntensity", [NSNumber numberWithFloat:0.00], nil]; 
     NSLog(@"desat ci filter created"); 
     //get the output 
     greyscaleImage = [desaturate valueForKey:@"outputImage"]; 
     NSLog(@"dest output image created"); 

     //if the user wants to add the alpha 
     if ([_alphaButtonSavedState isEqualToString:@"ON"]) { 
      NSLog(@"user does want alpha on greyscale"); 
      //user wants alpha mask also 
     } else { 
      NSLog(@"user does not want alpha on greyscale"); 
      //convert to CGImage for saving 
      greySave = [context createCGImage:greyscaleImage fromRect:[greyscaleImage extent]]; 
      NSLog(@"greySave cgimage created"); 

      //save the grey image 
      [library writeImageToSavedPhotosAlbum:greySave metadata:[greyscaleImage properties] completionBlock:^(NSURL *assetURL, NSError *error){ 
       if (error) { 
        NSLog(@"ERROR in greyscale save: %@", error); 
       } else 
       { 
        NSLog(@"SUCCESS in greyscale save"); 
        //in here we'll put a nice animation or something 
       } 
      }]; 
     } 
    } 

- еще два условными здесь, как в настоящее время пуст

- за которым следует сохранить для изображения colourSave, это работает отлично.

- тогда метод заканчивается.

Еще одна вещь, вот как я обрезаю изображение. Возвращается изображение из следующего метода является то, что я создать CIImage от:

-(UIImage *)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)rect 

{ CGImageRef imageRef = CGImageCreateWithImageInRect ([imageToCrop CGImage], прямоугольник);

UIImage *cropped = [UIImage imageWithCGImage:imageRef]; 
CGImageRelease(imageRef); 

return cropped; 

}

+0

Если это помогает, входное изображение в CIFilter является UIImage. – mrEmpty

+1

Можете ли вы установить точку останова на линии, где вы создаете 'CGImage', и посмотреть, что настроено значение« greyscaleImage »? Ошибка говорит о том, что объект 'greyscaleImage' не реализует метод' -extent'. Может ли «greyscaleImage» быть ноль или какой-либо другой тип объекта? – user1118321

+1

@ user1118321 логически, greyscaleImage - это CGImage, потому что он наследует от NSCFType. Это не ноль, потому что тогда он не потерпит крах, поскольку сообщения для nil производят ноль. – CodaFi

ответ

8

Добавление ответа в случае, если это помогает кому-либо еще.

Я проходил мимо UIImage в CIFilter, это вызывало проблему. Преобразование UIImage в CIImage и передача этого в разрешении проблемы.

+2

Как я люблю StackOverflow. Большое спасибо, мистер пуст. –