【问题标题】:Flipping Quicktime preview & capture翻转 Quicktime 预览和捕获
【发布时间】:2013-02-08 20:24:58
【问题描述】:

我需要水平翻转一些我正在预览和捕捉的视频。 A-la iChat,我有一个网络摄像头,希望它看起来就像用户在照镜子一样。

我正在QTCaptureView 中预览 Quicktime 视频。我的捕获是逐帧完成的(出于我不会进入的原因),例如:

imageRep = [NSCIImageRep imageRepWithCIImage: [CIImage imageWithCVImageBuffer: frame]];
image = [[NSImage alloc] initWithSize: [imageRep size]];
[image addRepresentation: imageRep];
[movie addImage: image forDuration: someDuration withAttributes: someAttributes];

有什么建议吗?

【问题讨论】:

    标签: objective-c cocoa quicktime


    【解决方案1】:

    没有什么比复活一个老问题更重要的了。无论如何,感谢 Brian Webster,我来到这里几乎找到了我想要的东西,但是如果有人正在寻找批发解决方案,请在将您的班级设置为 QTCaptureView 实例的代表后尝试此操作:

    - (CIImage *)view:(QTCaptureView *)view willDisplayImage:(CIImage *)image {
    //mirror image across y axis
    return [image imageByApplyingTransform:CGAffineTransformMakeScale(-1, 1)];
    }
    

    【讨论】:

      【解决方案2】:

      您可以通过获取从捕获中获取的 CIImage 并通过 Core Image 过滤器运行它来翻转图像来实现此目的。然后,您会将生成的图像传递给您的图像代表,而不是原始图像。代码看起来像:

      CIImage* capturedImage = [CIImage imageWithCVImageBuffer:buffer];
      NSAffineTransform* flipTransform = [NSAffineTransform transform];
      CIFilter* flipFilter;
      CIImage* flippedImage;
      
      [flipTransform scaleByX:-1.0 y:1.0]; //horizontal flip
      flipFilter = [CIImage filterWithName:@"CIAffineTransform"];
      [flipFilter setValue:flipTransform forKey:@"inputTransform"];
      [flipFilter setValue:capturedImage forKey:@"inputImage"];
      flippedImage = [flipFilter valueForKey:@"outputImage"];
      imageRep = [NSCIImageRep imageRepWithCIImage:flippedImage];
      ...
      

      【讨论】:

      • 看起来它可能可以用于录制,但是在QTCaptureView 中呢?
      • 这样的事情可能会起作用,对 flipFilter 变量使用与上面相同的设置:[captureView setWantsLayer:YES]; captureView.layer.filters = [NSArray arrayWithObject:flipFilter];
      • 太棒了 - 看起来效果很好!我必须通过视图宽度的负数添加平移变换,以将翻转的视频移回应有的位置,但这很容易。
      • 仅作记录:这似乎真的拖累了处理器。 Photobooth 和 iChat 必须以不同的方式做到这一点......
      • 刚刚注意到 QTCaptureView 有一个委托方法 view:willDisplayImage:,它可以让你修改它即将绘制的 CIImage。可能值得一试。
      【解决方案3】:

      试试这个! 它会将过滤器应用于 CaptureView,但不会应用于输出视频。

      - (IBAction)Vibrance:(id)sender
      {
          CIFilter* CIVibrance = [CIFilter filterWithName:@"CIVibrance" keysAndValues:
                                  @"inputAmount", [NSNumber numberWithDouble:2.0f],
                                  nil];
          mCaptureView.contentFilters = [NSArray arrayWithObject:CIVibrance];
      }
      

      顺便说一句,您可以应用此参考中的任何过滤器:https://developer.apple.com/library/mac/#documentation/graphicsimaging/reference/CoreImageFilterReference/Reference/reference.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-08
        • 2015-06-30
        • 2012-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多