Ориентация не корректно ведет себя с фото в 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
по своему усмотрению.