UIImagePickerController показывает правильное изображение, пока я не сохраню изображение

Я получаю UIImage с UIImagePickerController. Получив изображение, я установил его в качестве фона UITableView. Изображение выглядит именно так, как я его сделал. Но тогда, если я сохраню изображение на свой сервер, а затем загружу изображение обратно. Сохраняю ли я с помощью UIImagePNGRepresentation или UIImageJPEGRepresentation, изображение поворачивается при сохранении (поворот происходит до вызова сервера). Я читал здесь, что png будет вращаться, а jpeg - нет. Но у меня оба поворачиваются на 90 градусов. Любые мысли, почему jpeg плох в моем случае?

ЕЩЕ

Я получаю необработанное изображение из средства выбора изображений как UIImage. Затем я сохраняю указатель на UIImage. Некоторое время спустя я хочу сохранить UIImage. Обычно я делаю UIImagePNGRepresentation(myUIImage). Я использую AFNetworking как

if ([self.imageDictionaries count]>0)
  for (NSDictionary *imgDic in self.imageDictionaries) {
    [formData appendPartWithFileData:UIImagePNGRepresentation([imgDic objectForKey:@"image"])
    name:[imgDic objectForKey:@"name"]//@"image"
    fileName:[imgDic objectForKey:@"fileName"]//@"image.png"
    mimeType:[imgDic objectForKey:@"mimeType"]//@"image/png"
    ];
  }
}
//[imgDic objectForKey:@"name"] is just a UIImage

Один из элементов imageDictionaries выглядит так

NSDictionary *background =@{
                                @"image":self.backgroundImage,
                                @"name":@"bkgimg",
                                @"fileName":@"bkgimg.png",
                                @"mimeType":@"image/png"
                                };

Также обратите внимание, что мой код работает нормально. Единственная проблема заключается в том, что изображение вращается. self.backgroundImage — это указатель на UIImage, который я получил от UIImagePickerController как

UIImage *background = info[UIImagePickerControllerOriginalImage];

Изображение не вращается, если я использую UIImagePickerControllerEditedImage. Но это совсем другая история, в другой раз.


person Katedral Pillon    schedule 26.09.2014    source источник
comment
Ты все еще не даешь мне достаточно, чтобы продолжать. Что такое self.imageDictionaries?   -  person matt    schedule 27.09.2014
comment
Это словарь, в котором каждый элемент представляет собой словарь, содержащий: UIImage, NSString of imageName, NSString of fileName, NSString of mimeType. Комментарии рядом с каждой строкой также отображаются. Я включу пример элемента в код. Итак, снова imageDictionaries — это словарь словарей.   -  person Katedral Pillon    schedule 27.09.2014


Ответы (2)


Не сохраняйте его с помощью UIImagePNGRepresentation или UIImageJPEGRepresentation. Используйте фреймворк ImageIO. Это позволяет сохранить правильную информацию о вращении.

В качестве альтернативы, в зависимости от того, что вы делаете (вы не объяснили, как именно вы получаете эти изображения), может быть достаточно пройти через CGImage. Вы можете прикрепить к этому информацию о вращении, когда вы завершите это как UIImage.

person matt    schedule 26.09.2014
comment
Спасибо. Я никогда не слышал о структуре ImageIO. Я сделаю поиск для этого. - person Katedral Pillon; 27.09.2014
comment
Вот мое (краткое) введение в него: apeth.com/iOSBook/ch36.html#_image_file_formats - person matt; 27.09.2014
comment
Я обновил, чтобы показать, что я являюсь UIImage, как указано. Не могли бы вы показать, как я передал бы этот UIImage в afnetworking без вызова представления png/jpeg? я добавил немного кода - person Katedral Pillon; 27.09.2014
comment
Так вы каким-то образом получаете эти изображения из Интернета? Содержат ли они информацию об ориентации? Это может быть проблемой. Проверьте их свойство imageOrientation. - person matt; 27.09.2014

Изображение вращается, потому что вы сохраняете изображение в формате JPEG, если вы сохраните изображение в формате PNG, ориентация не изменится. вот код для исправления проблемы с ориентацией.

- (UIImage *)fixrotation:(UIImage *)image{


if (image.imageOrientation == UIImageOrientationUp) return image;
CGAffineTransform transform = CGAffineTransformIdentity;

switch (image.imageOrientation) {
    case UIImageOrientationDown:
    case UIImageOrientationDownMirrored:
        transform = CGAffineTransformTranslate(transform, image.size.width, image.size.height);
        transform = CGAffineTransformRotate(transform, M_PI);
        break;

    case UIImageOrientationLeft:
    case UIImageOrientationLeftMirrored:
        transform = CGAffineTransformTranslate(transform, image.size.width, 0);
        transform = CGAffineTransformRotate(transform, M_PI_2);
        break;

    case UIImageOrientationRight:
    case UIImageOrientationRightMirrored:
        transform = CGAffineTransformTranslate(transform, 0, image.size.height);
        transform = CGAffineTransformRotate(transform, -M_PI_2);
        break;
    case UIImageOrientationUp:
    case UIImageOrientationUpMirrored:
        break;
}

switch (image.imageOrientation) {
    case UIImageOrientationUpMirrored:
    case UIImageOrientationDownMirrored:
        transform = CGAffineTransformTranslate(transform, image.size.width, 0);
        transform = CGAffineTransformScale(transform, -1, 1);
        break;

    case UIImageOrientationLeftMirrored:
    case UIImageOrientationRightMirrored:
        transform = CGAffineTransformTranslate(transform, image.size.height, 0);
        transform = CGAffineTransformScale(transform, -1, 1);
        break;
    case UIImageOrientationUp:
    case UIImageOrientationDown:
    case UIImageOrientationLeft:
    case UIImageOrientationRight:
        break;
}

// Now we draw the underlying CGImage into a new context, applying the transform
// calculated above.
CGContextRef ctx = CGBitmapContextCreate(NULL, image.size.width, image.size.height,
                                         CGImageGetBitsPerComponent(image.CGImage), 0,
                                         CGImageGetColorSpace(image.CGImage),
                                         CGImageGetBitmapInfo(image.CGImage));
CGContextConcatCTM(ctx, transform);
switch (image.imageOrientation) {
    case UIImageOrientationLeft:
    case UIImageOrientationLeftMirrored:
    case UIImageOrientationRight:
    case UIImageOrientationRightMirrored:
        // Grr...
        CGContextDrawImage(ctx, CGRectMake(0,0,image.size.height,image.size.width), image.CGImage);
        break;

    default:
        CGContextDrawImage(ctx, CGRectMake(0,0,image.size.width,image.size.height), image.CGImage);
        break;
}

// And now we just create a new UIImage from the drawing context
CGImageRef cgimg = CGBitmapContextCreateImage(ctx);
UIImage *img = [UIImage imageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
return img; 
}
person Jaydeep Patel    schedule 23.10.2015