iOS: tomar imágenes de baja calidad

Quiero tomar permiso para que el usuario tome una foto y luego muestre la versión en escala de grises. Sin embargo, es muy lento porque el file de image es demasiado grande / la resolución es demasiado alta.

¿Cómo puedo networkingucir la calidad de la image cuando el usuario toma la fotografía?

Aquí está el código que estoy usando para la transformación:

- (UIImage *)convertImageToGrayScale:(UIImage *)image { // Create image rectangle with current image width/height CGRect imageRect = CGRectMake(0, 0, image.size.width, image.size.height); // Grayscale color space CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray(); // Create bitmap content with current image size and grayscale colorspace CGContextRef context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, colorSpace, kCGImageAlphaNone); // Draw image into current context, with specified rectangle // using previously defined context (with grayscale colorspace) CGContextDrawImage(context, imageRect, [image CGImage]); /* changes start here */ // Create bitmap image info from pixel data in current context CGImageRef grayImage = CGBitmapContextCreateImage(context); // release the colorspace and graphics context CGColorSpaceRelease(colorSpace); CGContextRelease(context); // make a new alpha-only graphics context context = CGBitmapContextCreate(nil, image.size.width, image.size.height, 8, 0, nil, kCGImageAlphaOnly); // draw image into context with no colorspace CGContextDrawImage(context, imageRect, [image CGImage]); // create alpha bitmap mask from current context CGImageRef mask = CGBitmapContextCreateImage(context); // release graphics context CGContextRelease(context); // make UIImage from grayscale image with alpha mask UIImage *grayScaleImage = [UIImage imageWithCGImage:CGImageCreateWithMask(grayImage, mask) scale:image.scale orientation:image.imageOrientation]; // release the CG images CGImageRelease(grayImage); CGImageRelease(mask); // return the new grayscale image return grayScaleImage; /* changes end here */ } 

¿Qué hay de networkingucir el muestreo del UIImage antes de pasarlo a la traducción en escala de grises? Algo como:

 NSData *imageAsData = UIImageJPEGRepresentation(imageFromCamera, 0.5); UIImage *downsampledImaged = [UIImage imageWithData:imageAsData]; 

Puede usar otras calidades de compression distintas a 0.5 por supuesto.

Si está utilizando AVFoundation para capturar la image, puede establecer la calidad de la image que se capturará cambiando la configuration de la session de captura como la siguiente:

 AVCaptureSession *session = [[AVCaptureSession alloc] init]; session.sessionPreset = AVCaptureSessionPresetLow; 

Hay una tabla cuyos resultados corresponden a qué resolución en la Guía de progtwigción de AVFoundation .