Проблемы ориентации CGImage при получении из ALAssset - PullRequest
3 голосов
/ 11 июня 2011

Я только начинаю изучать разработку приложений для iPhone.Я пытаюсь получить фотографии из моего фотоальбома с помощью класса ALAsset и загрузить фотографии на мой сервер.Однако фотографии, снятые в портретном режиме, поворачиваются на 90 градусов влево, в то время как фотографии пейзажей загружаются правильно.Что я делаю неправильно?В NSLog я вижу ориентацию, равную 3, но все равно фотография поворачивается на 90 градусов влево.Любая помощь будет принята с благодарностью.

Вот фрагмент моего кода:

ALAssetsLibraryAssetForURLResultBlock resultblock = ^(ALAsset *myasset)
{
   NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
   NSString *documentsDirectory = [paths objectAtIndex:0];

   imagePath = [[documentsDirectory stringByAppendingPathComponent:@"latest_photo.jpg"] copy];
   NSLog(@"imagePath = %@", imagePath);

   ALAssetRepresentation *rep = [myasset defaultRepresentation];
   ALAssetOrientation orientation = [rep orientation];
   NSLog(@"Orientation = %d", orientation);

   CGImageRef iref = [rep fullResolutionImage];

   if (iref) {
      UIImage *largeimage = [UIImage imageWithCGImage:iref scale:1.0 orientation:orientation];
      NSData *webData = UIImageJPEGRepresentation(largeimage,0.5);

      [webData writeToFile:imagePath atomically:YES];

      // Upload the image

Ответы [ 2 ]

8 голосов
/ 23 июня 2011

Для части кода, ориентированной на ресурсы, вместо

ALAssetRepresentation *rep = [myasset defaultRepresentation];
ALAssetOrientation orientation = [rep orientation];

Попробуйте

ALAssetOrientation orientation = [[asset valueForProperty:@"ALAssetPropertyOrientation"] intValue];
0 голосов
/ 11 июня 2011

Вы можете перерисовать изображение в контекст изображения. Затем получите данные изображения из контекста и, в зависимости от ваших потребностей, отправьте данные или сохраните файл для отправки позже.

UIGraphicsBeginImageContext(largeImage.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextRotateCTM(context, M_PI / 2); // Or negative M_PI depending on the image's orientation
largeImage.imageOrientation = UIImageOrientationLeft;
[largeImage drawAtPoint:CGPointZero];
NSData *rotatedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Возможно, вам понадобится «правильная» ориентация изображения, в зависимости от того, как повернуты ваши портретные фотографии, но это всего лишь вопрос одного теста.

...