AVAssetImageGenerator предоставляет повернутые изображения

При получении UIImage видео через AVAssetImageGenerator я получаю обратно повернутые изображения (ну, технически это не так), когда видео снимается в портретной ориентации. Как я могу определить, в какой ориентации было снято видео, а затем правильно повернуть изображение?

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

person E-Madd    schedule 18.03.2011    source источник


Ответы (3)


Самый простой способ - просто установить для свойства appliesPreferredTrackTransform в генераторе изображений значение YES, после чего преобразование должно выполняться автоматически.

person Anomie    schedule 18.03.2011
comment
Большое спасибо! Я просмотрел документацию, но название этого свойства просто не предполагало, что оно имеет какое-либо отношение к проблеме. - person E-Madd; 18.03.2011
comment
По какой-то причине установка его на YES (тоже пробовал NO, без разницы) ничего не дала, и он все еще вращается. (актив заключен в GPUImageMovie, если это помогает). - person Can Poyrazoğlu; 17.04.2017

Решение для копирования и вставки для создания изображения с ориентацией записи с использованием предыдущего ответа.

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);
person ant_one    schedule 29.04.2014

Вот решение в быстрой версии 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
}
person Amrit Sidhu    schedule 13.05.2018