title: NSInvalidArgument error - CGImageRef from CIImage
body: <p>I'm getting an error on some code that two days ago was running fine.  The error is:</p>
  
  <pre><code>*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFType extent]: unrecognized selector sent to instance 0x1bc8f0'
  </code></pre>
  
  <p>it points to this line on main.m:</p>
  
  <pre><code>return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
  </code></pre>
  
  <p>Using logs to see where my code gets to it seems this line is throwing the error:</p>
  
  <pre><code>greySave = [context createCGImage:greyscaleImage fromRect:[greyscaleImage extent]];
  </code></pre>
  
  <p>greySave is a CGImageRef, declared at the start of my view controller.  It's simple grabbing a CIImage output and converting it to a CGImageRef for saving:</p>
  
  <pre><code>desaturate = [CIFilter filterWithName:@"CIColorMonochrome" keysAndValues:kCIInputImageKey, colourSave, @"inputIntensity", [NSNumber numberWithFloat:0.00], nil];
  
  
  greyscaleImage = [desaturate valueForKey:@"outputImage"];
  
  
  greySave = [context createCGImage:greyscaleImage fromRect:[greyscaleImage extent]];
  </code></pre>
  
  <p>The only thing I have changed that I think (although do not understand why) could be causing the problem is adding an extra conditional statement, which would apply a second filter is the user wishes to do so:</p>
  
  <pre><code>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);
                  }
              }];
  </code></pre>
  
  <p>Any ideas why this is happening?</p>
  
  <p>Thanks.</p>
  
  <p>EDIT:</p>
  
  <p>Here is the entire chunk of code, just in case that helps.</p>
  
  <pre><code>[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
                  }
              }];
          }
      }
  </code></pre>
  
  <p>--  two more conditionals here, both currently empty</p>
  
  <p>-- followed by a save for the colourSave image, this works fine.</p>
  
  <p>-- then the method ends.</p>
  
  <p>One more thing, this is how I'm cropping the image.  The returned image from the following method is what I create a CIImage from:</p>
  
  <pre><code>-(UIImage *)imageByCropping:(UIImage *)imageToCrop toRect:(CGRect)rect
  </code></pre>
  
  <p>{
      CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect);</p>
  
  <pre><code>UIImage *cropped = [UIImage imageWithCGImage:imageRef];
  CGImageRelease(imageRef);
  
  return cropped;
  </code></pre>
  
  <p>}</p>