2012-06-07 1 views
9

Я беру фото с AVFoundation как здесь: http://red-glasses.com/index.php/tutorials/ios4-take-photos-with-live-video-preview-using-avfoundation/Как сделать квадратную картинку в iphone с помощью avFoundation, как в приложении Instagram?

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

[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 пикселей (квадратные изображения). Кажется, instagram делает это (или они обрезают изображения?).

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

Любая идея?

ответ

11

Возможно, вы должны изменить размер своего 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 

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

+0

Это единственный способ? Думаю, изображение будет выглядеть хуже, если бы оно было изменено. Можно ли сфотографировать пользовательский размер и не изменять его размер? – DixieFlatline

+0

ни одна камера не может делать снимки разных размеров. Он будет всегда использовать полное разрешение и размер его, если вы используете меньшие изображения. У Instagram также нет другой возможности, кроме того, чтобы вырезать из полного изображения. В этом примере размер '400px', но вы можете увидеть, насколько широким является исходное изображение и сделать прямоугольник с одинаковым размером по высоте. Это приведет к квадратному изображению, и вы потеряете несколько пикселей выше и ниже. –

+0

Масштабирование изображения вниз, предполагая приличную интерполяцию, заставляет его смотреть _better_ не хуже, поэтому ваши опасения необоснованны. – podperson

0

Я нашел один код для съемки с использованием AVCaptureSession ... и это отличный учебник от «JJob», см. Этот click on this link лучший учебник об AVCaptureSession и, пожалуйста, прочитайте все комментарии и предыдущие уроки этого сайта, это поможет вы много .... вы можете скачать рабочий пример кода от here .... !!

спасибо!

+3

этот ответ настолько отрывочен ... –

+1

Фантастический ответ, спасибо - бесценные ссылки – Fattie

Смежные вопросы