AVAssetImageGenerator provides images rotated
IphoneObjective CIosAvfoundationIphone Problem Overview
When obtaining a UIImage of a video via AVAssetImageGenerator, I'm getting back images rotated (well, technically they're not) when the video is shot in portrait orientation. How can I tell what orientation the video was shot and then rotate the image properly?
AVURLAsset *asset = [[AVURLAsset alloc] initWithURL:url options:nil];
AVAssetImageGenerator *generate = [[AVAssetImageGenerator alloc] initWithAsset:asset];
NSError *err = NULL;
CMTime time = CMTimeMake(0, 60);
CGImageRef imgRef = [generate copyCGImageAtTime:time actualTime:NULL error:&err];
[generate release];
UIImage *currentImg = [[UIImage alloc] initWithCGImage:imgRef];
Iphone Solutions
Solution 1 - Iphone
The easiest way is to just set the appliesPreferredTrackTransform
property on the image generator to YES, then it should automatically do the transformation for you.
Solution 2 - Iphone
The copy and paste solution to create image with the recording orientation using the previous answer.
AVURLAsset* asset = [AVURLAsset URLAssetWithURL:url options:nil];
AVAssetImageGenerator* imageGenerator = [AVAssetImageGenerator assetImageGeneratorWithAsset:asset];
imageGenerator.appliesPreferredTrackTransform = YES;
CGImageRef cgImage = [imageGenerator copyCGImageAtTime:CMTimeMake(0, 1) actualTime:nil error:nil];
UIImage* image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
Solution 3 - Iphone
Here is the solution in swift version 4:
func thumbnailImageForFileUrl(_ fileUrl: URL) -> UIImage? {
let asset = AVAsset(url: fileUrl)
let imageGenerator = AVAssetImageGenerator(asset: asset)
imageGenerator.appliesPreferredTrackTransform = true
do {
let thumbnailCGImage = try imageGenerator.copyCGImage(at: CMTimeMake(1, 60), actualTime: nil)
return UIImage(cgImage: thumbnailCGImage)
} catch let err {
print(err)
}
return nil
}
Solution 4 - Iphone
the easiest way is
imageGenerator.appliesPreferredTrackTransform = true
the hardest way is to change image orientation by this code:
let orient: UIImage.Orientation = isVertical ? .left: .up
imageView.image = UIImage(cgImage: image.cgImage!, scale: image.scale, orientation: orient)