Я получаю сообщение об ошибке в коде, который два дня назад работал нормально. Ошибка:Ошибка 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;
}
Если это помогает, входное изображение в CIFilter является UIImage. – mrEmpty
Можете ли вы установить точку останова на линии, где вы создаете 'CGImage', и посмотреть, что настроено значение« greyscaleImage »? Ошибка говорит о том, что объект 'greyscaleImage' не реализует метод' -extent'. Может ли «greyscaleImage» быть ноль или какой-либо другой тип объекта? – user1118321
@ user1118321 логически, greyscaleImage - это CGImage, потому что он наследует от NSCFType. Это не ноль, потому что тогда он не потерпит крах, поскольку сообщения для nil производят ноль. – CodaFi