2012-01-12 16 views
15

Mam obecnie aplikację, która używa biblioteki ALAsssetsLibrary do pobierania zdjęć. Umieściłem zdjęcie w widoku obrazu i mogę je przesłać na serwer. Kiedy testowałem na prawdziwym urządzeniu po zrobieniu zdjęć, odkryłem, że zdjęcia, które miały zostać zrobione w Pionie, stają się krajobrazem.Orientacja nie działa poprawnie ze zdjęciem w ALAsset

Dlatego zadzwoniłem inną funkcję, aby uzyskać CGImage tak:

UIImage *image = [UIImage imageWithCGImage:[representation fullResolutionImage] scale:1.0 orientation:(UIImageOrientation)[representation orientation]]; 

Pierwszy starał się, użyłem to:

UIImage *image = [UIImage imageWithCGImage:[representation fullResolutionImage]] 

myślałem, że jeden ze skali i orientacji może dać mi właściwą orientację, że zdjęcie zostało zrobione. Ale nie dało mi to właściwego rozwiązania.

Czy brakuje mi czegokolwiek, co jest konieczne do uzyskania prawidłowej orientacji zdjęcia?

+1

Ten problem występuje w przypadku zdjęć pobranych z urządzenia – Leena

Odpowiedz

44

Właściwa obsługa orientacji zależy od wersji systemu iOS, z której korzystasz. Na iOS4 i iOS 5 miniaturka jest już poprawnie obrócona, więc możesz zainicjować swój UIImage bez określania jakichkolwiek parametrów rotacji. Jednak dla obrazu FullScreen zachowanie różni się dla każdej wersji iOS. Na iOS 5 obraz jest już obrócony na iOS 4 nie.

Więc na iOS4 należy użyć:

ALAssetRepresentation *defaultRep = [asset defaultRepresentation]; 
UIImage *_image = [UIImage imageWithCGImage:[defaultRep fullScreenImage] 
                scale:[defaultRep scale] orientation:(UIImageOrientation)[defaultRep orientation]]; 

Na iOS5 następujący kod powinien działać poprawnie:

ALAssetRepresentation *defaultRep = [asset defaultRepresentation]; 
UIImage *_image = [UIImage imageWithCGImage:[defaultRep fullScreenImage] scale:[defaultRep scale] orientation:0]; 

Wiwaty,

Hendrik

+0

W moim przypadku potrzebowałem FullResolutionImage i przetestowałem na iOS 6 i 7. Obraz nie został automatycznie obrócony, ale pierwszy przykładowy kod robi lewę! Człowiek dziękuję! P.S. zachowaj ostrożność, jeśli zapisujesz obraz do pliku za pomocą metadanych. Jeśli obróciłeś obrazek, musisz ustawić orientację EXIF ​​na 0, aby uniknąć dziwnych obróconych jpeg;) – Primoz990

+0

Muszę poprawić mój komentarz. Pierwszy przykład kodu nie obrócił mojego obrazu FullResolution, musiałem go obrócić samemu. Ale zgadzam się, że fullScreenImage jest automatycznie obracany na iOS 6 i 7. – Primoz990

+0

Świetnie! Działa też dla mnie z iOS 7! Wielkie dzięki ! – Vinestro

4

Spróbuj ten kod: -

UIImage* img = [UIImage imageWithCGImage:asset.thumbnail]; 
img = [UIImage imageWithCGImage:img.CGImage scale:1.0 orientation:UIImageOrientationUp]; 

To może pomóc.

+0

Nie mogę tego teraz wypróbować, ponieważ nie jestem właścicielem urządzenia. Czy mógłbyś wyjaśnić mi te dwie linie kodu? Img w pierwszym wierszu to miniaturka zasobu, ale nie rzeczywisty obraz. – LittleFunny

+0

Użyłem miniatury obrazu i zachowałem orientację obrazu w górę, więc nie zostanie obrócone, działa w moim przypadku. – Leena

+0

Może mam inny problem ... Ale dziękuję za pomoc – LittleFunny

3

Moje doświadczenie jest ograniczona do IOS 5.x, ale mogę powiedzieć, że miniatury i obrazy pełnoekranowe są zorientowane pro perly. Jest to pełny obraz rozdzielczości, który jest poziomy w przypadku ujęcia w pionie. Moje rozwiązanie jest użycie kategorię po UIImage że mam stąd:

http://www.catamount.com/forums/viewtopic.php?f=21&t=967&start=0

Zapewnia piękny metodę rotacyjną na UIImage jak ten:

 UIImage *tmp = [UIImage imageWithCGImage:startingFullResolutionImage]; 
     startingFullResolutionImage = [[tmp imageRotatedByDegrees:-90.0f] CGImage]; 
+0

Właśnie użyłem fullresolutionimage i zadziałało to dla mnie. Dzięki. – Ali

0

Dla fullResolutionImage, chciałbym dostarczenie rozwiązania następująco,

ALAssetRepresentation *rep = [asset defaultRepresentation]; 

// First, write orientation to UIImage, i.e., EXIF message. 
UIImage *image = [UIImage imageWithCGImage:[rep fullResolutionImage] scale:rep.scale orientation:(UIImageOrientation)rep.orientation]; 
// Second, fix orientation, and drop out EXIF 
if (image.imageOrientation != UIImageOrientationUp) { 
    UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale); 
    [image drawInRect:(CGRect){0, 0, image.size}]; 
    UIImage *normalizedImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    image = normalizedImage; 
} 
// Third, compression 
NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 

imageData to, co chcesz, i po prostu przesłać go na serwer zdjęć.

Przy okazji, jeśli uważasz, że EXIF ​​jest przydatny, możesz go uzupełnić do normalizedImage, jak chcesz.