CGAffineTransform缩放未从中心进行缩放 - 带导出

3
我想我提出的问题与其他帖子不同之处在于,我不是缩放视图,而是一个资源层指令(AVMutableVideoCompositionLayerInstruction)进行缩放。因此,设置锚点、view.center、CG Rect缩放都无效。
除了使用CGAffineTransformMakeTranslation将资源移动以使其看起来像是居中对齐,但这种方法精度极低,我不能想出如何使它从中心点缩放。是否有我遗漏的属性?文档和指南并不十分有用,但也许我错过了某些内容。
代码如下。非常感谢大家!!! :)
另外,对于那些寻找使用CGTransforms导出avasset的方法的人,下面的代码是完成此操作的所有步骤;当然需要填写细节,例如CMTimeRanges,但希望这有助于帮助有困惑的人弄清楚这个麻烦的东西。
-(void) goAssetsExport {
    AVMutableComposition *composition = [[AVMutableComposition alloc] init];

    AVMutableCompositionTrack *firstTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];

    AVMutableVideoComposition *videoComposition = [AVMutableVideoComposition videoComposition];
    videoComposition.frameDuration = CMTimeMake(1,30);
    videoComposition.renderScale = 1.0;
    videoComposition.renderSize = CGSizeMake(self.view.bounds.size.width, self.view.bounds.size.height);

    NSURL *movieURL = [[NSBundle mainBundle] URLForResource:[NSString stringWithFormat:@"%@",   [preloadEffectsArray objectAtIndex:i]]  withExtension:@"mov"];
    AVURLAsset *firstAsset = [AVURLAsset URLAssetWithURL:movieURL options:nil];
    AVAssetTrack *firstAssetTrack = [[firstAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];

    [firstTrack insertTimeRange:CMTimeRangeMake(firstTrackRangeMin, duration) ofTrack:firstAssetTrack atTime:firstTrackRangeMin error:nil];

    AVMutableVideoCompositionInstruction *transitionInstruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction];

    AVMutableVideoCompositionLayerInstruction *fromLayer = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:firstTrack];


    //**This is where problem might be?**//
    CGAffineTransform Scaler = CGAffineTransformMakeScale(scaleNumber,scaleNumber);
    CGAffineTransform Mover = CGAffineTransformMakeTranslation(scaleNumber * -100, scaleNumber * -150);

    [fromLayer setTransform:CGAffineTransformConcat(Scaler,Mover) atTime:firstTrackRangeMin];

    transitionInstruction.layerInstructions = [NSArray arrayWithObject:fromLayer];

    videoComposition.instructions = instructionArray;

    [self exportVideo:composition withInstructionComposition:videoComposition];
}

“从中心缩放”这个说法并不是很清晰。与旋转不同,缩放是与位置无关的。 - David Berry
嗨David,抱歉如果不清楚。我想让图像在屏幕中心缩放变大。现在它会变大,但是从屏幕左上角开始变大。 - Tae Re
现在看起来你的变换会将图像向上和向左移动。你想要的是在缩放后按照 delta 宽度 / 2,delta 高度 / 2 进行平移。 - David Berry
抱歉回复晚了,但我一直在尝试不同的方法来使增量或变化正常工作。唯一接近的方法是将偏移量(int offset = scaleNumber * 100)添加到移动器中。(CGAffineTransform Mover = CGAffineTransformMakeTranslation(deltaWidth/2 + offset, deltaHeight/2 + offset);我希望有一个属性可以让资产居中于视图。我会继续尝试不同的方法,欢迎任何其他建议。谢谢David。 - Tae Re
1个回答

1

CGAffineTransform 在 Quartz 坐标系统中起作用,这是您应该开始的点:

CGAffineTransform  translate = CGAffineTransformMakeTranslation((x,y);
CGAffineTransform  scale = CGAffineTransformMakeScale(q,z);
CGAffineTransform finalTransform = CGAffineTransformConcat(scale, CGAffineTransformConcat(translate, assetTrackForVideo1.preferredTransform));
        [layerInstructionForVideo setTransform:finalTransform atTime:kCMTimeZero];
        [layerInstructions addObject:layerInstructionForVideo];

那种转换对我有用。
编辑:我的错误,忘记编辑所有代码!

谢谢Rijii_Kot,我从没想过使用两个CGAffineTransformConcat将其调整到所需位置。你是如何计算shrinkWidth和translateTocenter的值的? - Tae Re
最终转换使用 translate 和 scale CGAffineTransform,我已经编辑了我的答案。 - DimaC
@Rijii_Kot,你这行代码 CGAffineTransform translate = CGAffineTransformMakeTranslation((x,y); 的 Swift 版本应该是这样的:var translate = CGAffineTransform(translationX: x, y: y)。 - Khushbu Desai

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