Ориентация не корректно ведет себя с фото в ALAsset

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

Поэтому я назвал другую функцию, чтобы получить CGImage следующим образом:

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

Первый опробованный, я использовал это:

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

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

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

Ответы

Ответ 1

Правильная ориентация зависит от версии iOS, которую вы используете. На iOS4 и iOS 5 миниатюра уже правильно повернута, поэтому вы можете инициализировать свой UIImage без указания параметров вращения. Однако для fullScreenImage поведение отличается для каждой версии iOS. На iOS 5 изображение уже повернуто на iOS 4.

Итак, на iOS4 вы должны использовать:

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

В iOS5 следующий код должен работать правильно:

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

Приветствия,

Хендрик

Ответ 2

Попробуйте этот код: -

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

Это может вам помочь.

Ответ 3

Мой опыт ограничен IOS 5.x, но могу сказать, что эскизы и полноэкранные изображения ориентированы правильно. Это полное разрешение, которое горизонтально при выстреле вертикально. Мое решение состоит в том, чтобы использовать категорию по uiimage, которую я получил отсюда:

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

Он обеспечивает хороший вращающийся метод для UIImage, как это:

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

Ответ 4

Для fullResolutionImage, я хотел бы предоставить решение следующим образом:

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 - это то, что вы хотите, и просто загрузите его на свой фотосервер.

Кстати, если вы думаете, что EXIF ​​полезен, вы можете дополнить его до normalizedImage по своему усмотрению.