Как сделать квадратный снимок на iphone с помощью avFoundation, как в приложении Instagram?

Я фотографирую с помощью AVFoundation, как здесь: http://red-glasses.com/index.php/tutorials/ios4-take-photos-with-live-video-preview-using-avfoundation/

Один фрагмент:

[stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error)
 {
     CFDictionaryRef exifAttachments = CMGetAttachment( imageSampleBuffer, kCGImagePropertyExifDictionary, NULL);
     if (exifAttachments)
     {
         // Do something with the attachments.
         NSLog(@"attachements: %@", exifAttachments);
     }
     else
         NSLog(@"no attachments");

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

Размер картинки, насколько я узнал, установлен здесь:

   AVCaptureSession *session = [[AVCaptureSession alloc] init];  
   session.sessionPreset =AVCaptureSessionPresetMedium; //medium on my iphone4 is 640*480

Но здесь возможны лишь несколько настроек, и их нельзя установить на нестандартный размер.

Я хотел бы, чтобы у сделанных снимков было соотношение сторон 1: 1, если это возможно, например 400x400 пикселей (квадратные изображения). Кажется, инстаграмм это делает (или они кадрируют изображения?).

Как сделать так, чтобы размер снимка был квадратным? Я знаю, как изменить размер на телефоне, но если полученный снимок не квадратный, результат плохой.

Любая идея?


person DixieFlatline    schedule 07.06.2012    source источник


Ответы (2)


Вероятно, вам следует изменить размер вашего UIImage, создав новый контекст. Примеры ниже

.....
UIImage *image = [[UIImage alloc] initWithData:imageData];
UIImage *tempImage = nil;
CGSize targetSize = CGSizeMake(400,400);
UIGraphicsBeginImageContext(targetSize);

CGRect thumbnailRect = CGRectMake(0, 0, 0, 0);
thumbnailRect.origin = CGPointMake(0.0,0.0);
thumbnailRect.size.width  = targetSize.width;
thumbnailRect.size.height = targetSize.height;

[image drawInRect:thumbnailRect];

tempImage = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

// tmpImage is resized to 400x400

Надеюсь это поможет !

person skram    schedule 07.06.2012
comment
Это единственный способ? Думаю, изображение выглядело бы хуже, если бы его размер был изменен. Можно ли сфотографировать нестандартный размер и не изменять его размер? - person DixieFlatline; 07.06.2012
comment
ни одна камера не может делать снимки в разных размерах. Он всегда будет использовать полное разрешение и уменьшит его размер, если вы используете изображения меньшего размера. У Instagram также нет другой возможности, кроме как вырезать прямоугольник из полного изображения. В этом примере размер 400px, но вы можете увидеть ширину исходного изображения и создать прямоугольник такого же размера по высоте. Это приведет к квадратному изображению, и вы потеряете несколько пикселей вверху и внизу. - person ; 11.06.2012
comment
Уменьшение масштаба изображения, при условии хорошей интерполяции, сделает его лучше, а не хуже, поэтому ваши опасения необоснованны. - person podperson; 11.06.2012
comment
есть разные предустановки для размеров фотографий, снимки меньшего размера более эффективны и быстрее, AVCaptureSessionPresetMedium должно быть достаточно - person Felix; 12.06.2012