2012-06-07 14 views
9

Biorę zdjęcie z AVFoundation jak tutaj: http://red-glasses.com/index.php/tutorials/ios4-take-photos-with-live-video-preview-using-avfoundation/Jak zrobić kwadratowe zdjęcie w iPodzie z avFoundation jak w aplikacji na Instagramie?

Jeden fragment:

[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]; 

rozmiar zdjęcia tak daleko jak się dowiedziałem jest ustawiony tutaj:

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

Ale tu są tylko kilka ustawień możliwe i nie można ustawić na niestandardowy rozmiar.

Chciałbym, aby w miarę możliwości obrazy miały proporcje 1: 1, na przykład 400 x 400 pikseli (obrazy kwadratowe). Wygląda na to, że instagram to robi (czy przycinają obrazy?).

Jak określić rozmiar robienia zdjęcia kwadratowego? Wiem, jak zmienić rozmiar w telefonie, ale jeśli zrobione zdjęcie nie jest kwadratowe, wynik nie jest dobry.

Każdy pomysł?

Odpowiedz

11

Prawdopodobnie powinieneś zmienić rozmiar swojego UIImage, tworząc nowy kontekst. Przykłady poniżej:

..... 
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 

Mam nadzieję, że to pomoże!

+0

Czy to jedyny sposób? Myślę, że obraz wyglądałby gorzej, gdyby został zmieniony. Czy można zrobić zdjęcie niestandardowego wymiaru i nie zmieniać jego rozmiaru? – DixieFlatline

+0

ani jedna kamera nie może robić zdjęć w różnych wymiarach. Zawsze użyje pełnej rozdzielczości i zmniejszy rozmiar, jeśli użyjesz mniejszych obrazów. Instagram również nie ma innej możliwości niż przycięcie prostokąta z pełnego obrazu. W tym przykładzie rozmiar wynosi '400px', ale możesz zobaczyć, jak szeroki jest oryginalny obraz i zrobić prostokąt o tym samym rozmiarze. Spowoduje to powstanie kwadratu i utracisz kilka pikseli powyżej i poniżej. –

+0

Skalowanie obrazu w dół, przy założeniu przyzwoitej interpolacji, sprawi, że nie będzie gorzej wyglądało, więc twoje obawy są bezpodstawne. – podperson

0

Znalazłem jeden kod do zrobienia zdjęcia przy użyciu AVCaptureSession ... i jest to świetny samouczek "JJob" zobacz ten click on this link najlepszy tutorial o AVCaptureSession i przeczytaj wszystkie komentarze i poprzednie samouczki na tej stronie to pomoże bardzo dużo ... możesz pobrać działający kod przykładowy z here .... !!

Dziękuję!

+3

ta odpowiedź jest tak pobieżna ... –

+1

Fantastyczna odpowiedź, dzięki - bezcenne linki – Fattie