AVAssetImageGenerator提供旋转的图像。

58

通过AVAssetImageGenerator获取视频的UIImage时,如果视频是以纵向拍摄,我得到的图像会被旋转(尽管从技术上来说它们并没有被旋转)。如何判断视频的方向并正确旋转图像?

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];
4个回答

240

最简单的方法就是将图像生成器的appliesPreferredTrackTransform属性设置为YES,然后它应该会自动为您进行转换。


1
非常感谢!我浏览了文档,但是这个属性的名称并没有让我想到它与问题有任何关系。 - E-Madd
由于某种原因,将其设置为“YES”(也尝试过“NO”,没有区别)并没有起作用,它仍然旋转着。(如果有帮助的话,该资产被一个“GPUImageMovie”所封装)。 - Can Poyrazoğlu

25

使用之前的答案复制并粘贴解决方案,以创建具有录音方向的图像。

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);

8

这是Swift 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
}

1
最简单的方法是:
imageGenerator.appliesPreferredTrackTransform = true

最困难的方法是通过以下代码更改图像方向:

let orient: UIImage.Orientation = isVertical ? .left: .up
imageView.image = UIImage(cgImage: image.cgImage!, scale: image.scale, orientation: orient)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接