Ориентация не работает правильно с фото в ALAsset - PullRequest
15 голосов
/ 12 января 2012

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

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

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

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

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

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

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

Ответы [ 4 ]

45 голосов
/ 25 февраля 2012

Правильная обработка ориентации зависит от используемой версии 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];

Ура,

Хендрик

4 голосов
/ 12 января 2012

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

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

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

3 голосов
/ 30 марта 2012

Мой опыт ограничен 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];
0 голосов
/ 19 февраля 2016

Для 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, если хотите.

...