Testuję moją aplikację iPhone na telefonie iPhone z systemem iOS 3.1.3. Wybieram / rejestruję obraz za pomocą UIImagePickerController
:
UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
[imagePicker setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePicker setDelegate:self];
[self.navigationController presentModalViewController:imagePicker animated:YES];
[imagePicker release];
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
self.image = [info objectForKey:UIImagePickerControllerOriginalImage];
imageView.image = self.image;
[self.navigationController dismissModalViewControllerAnimated:YES];
submitButton.enabled = YES;
}
Następnie w pewnym momencie wysyłam go na mój serwer internetowy za pomocą klas ASI:
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:@"http://example.com/myscript.php"]];
[request setDelegate:self];
[request setStringEncoding:NSUTF8StringEncoding];
[request setShouldContinueWhenAppEntersBackground:YES];
//other post keys/values
[request setFile:UIImageJPEGRepresentation(self.image, 100.0f) withFileName:[NSString stringWithFormat:@"%d.jpg", [[NSDate date] timeIntervalSinceNow]] andContentType:@"image/jpg" forKey:@"imageFile"];
[request startAsynchronous];
problem: kiedy robię zdjęcie iPhonem trzymając go w pozycji poziomej, obraz zostaje przesłany na serwer i wygląda tak, jak można się spodziewać. podczas robienia zdjęcia z telefonem w pozycji pionowej zdjęcie jest przesyłane i oglądane tak, jakby było obrócone o 90 stopni.
moja aplikacja działa tylko w trybach portretowych (odwrócony i zwykły).
Jak sprawić, by obraz zawsze wyświetlał prawidłową orientację po przesłaniu?
obraz wydaje się być poprawny, jak pokazano w UIImageView (bezpośrednio po zrobieniu zdjęcia), ale wyświetlanie na serwerze mówi inaczej.
Wymyśliłem znacznie prostszy:
BTW: Kod @ Anomie nie bierze
scale
pod uwagę, więc nie będzie działać dla 2x zdjęć.źródło
self
obiekt UIImage.Oto szybka wersja odpowiedzi autorstwa @ an0:
Również w bardziej ogólnej funkcji:
Wersja Swift 3:
źródło
Rozwiązanie dla Swift 3.1 dla problemu z orientacją podczas przechwytywania obrazu z aparatu.
Zaktualizowałem rozwiązanie podane przez jake i Metal Heart
Rozszerzenie UIImage
Swift 2.0
Użyj tego rozszerzenia UIImage w swoim kodzie:
niech fixOrientationImage = selectedImage.fixOrientation ()
umieść to w swoich delegowanych metodach wyboru obrazu w ten sposób
Swift 3.1
Swift 2.0
źródło
szybko;)
AKTUALIZACJA SWIFT 3.0: D
źródło
Wersja
@an0
rozwiązania Swift 4.x / 5.0 :źródło
Użyłem tej strony podczas projektowania mojej aplikacji do robienia zdjęć i stwierdziłem, że następująca metoda poprawi orientację i zużyje mniej pamięci i procesora niż poprzednie odpowiedzi:
To po prostu przepakowuje rzeczywiste dane obrazu w nowej orientacji. Korzystałem z kodu @ an0, ale tworzy on nowy obraz w pamięci, który może obciążać podatek od obrazu 3264 x 2448, który można uzyskać z aparatu.
źródło
Jeśli włączysz edycję, edytowany obraz (w przeciwieństwie do oryginału) będzie zorientowany zgodnie z oczekiwaniami:
Włączenie edycji pozwala użytkownikowi zmienić rozmiar obrazu i przenieść go przed dotknięciem „Użyj zdjęcia”
źródło
To, co znalazłem do rozwiązania problemu z orientacją
EDYTOWAĆ:
źródło
Aktualizacja do Swift 3.1 na podstawie
Sourabh Sharma
odpowiedzi, z czyszczeniem kodu.Przykład metody delegowania próbnika:
źródło
Oto rozwiązanie, które nie zmienia przestrzeni kolorów oryginalnego obrazu. Jeśli chcesz znormalizować orientację obrazu w skali szarości, nie masz szczęścia ze wszystkimi rozwiązaniami opartymi na
UIGraphicsBeginImageContextWithOptions
tym, że tworzy on kontekst w przestrzeni kolorów RGB. Zamiast tego musisz utworzyć kontekst o takich samych właściwościach jak oryginalny obraz i narysować:źródło
Oto rozszerzenie UIImage dla szybkiego:
Na podstawie wcześniejszej pracy MetalHeart2003.
źródło
Oto rozszerzenie UIImage w Swift 2 oparte na zaakceptowanej odpowiedzi @Anomie. Wykorzystuje jaśniejszą obudowę przełącznika. Uwzględnia również zwracaną wartość opcjonalną
CGBitmapContextCreateImage()
.źródło
Wystąpił ten problem z obrazami wykonanymi z aparatu lub zapisanymi w rolce aparatu, które zostały pobrane z aparatu. Obrazy pobrane w bibliotece zdjęć z przeglądarki Safari nie obracają się po przesłaniu.
Udało mi się rozwiązać ten problem, tworząc dane obrazu w formacie JPEG przed przesłaniem.
Teraz możemy użyć danych do przesłania, a obraz nie zostanie obrócony po przesłaniu.
Mam nadzieję, że to zadziała.
źródło
Osiągam to pisząc poniżej kilka wierszy kodu
źródło
Jeśli rozumiem, co chcesz zrobić, to zignorować orientację Maga UII? Jeśli tak, to możesz to zrobić:
lub w trybie Swift: -
To rozwiązało mój problem kadrowania. Mam nadzieję, że tego właśnie szukasz.
źródło
Wersja Swift 3 oparta na @ jake1981, który wziął ją z @ MetalHeart2003
źródło
źródło
Oto kod Swift-4.2 do automatycznej naprawy orientacji obrazu Zwraca UIImage
źródło
Transponowałem to do Xamarin:
źródło