- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个 CGRect
,我想使用 GPUImage 来裁剪视频。例如,如果矩形是 (0, 0, 50, 50)
,则视频将在 (0,0)
处裁剪,每边的长度为 50 .
令我震惊的是,GPUImageCropFilter
不采用矩形,而是采用值范围为 0 到 1 的标准化裁剪区域。我的直觉是:
let assetSize = CGSizeApplyAffineTransform(videoTrack.naturalSize, videoTrack.preferredTransform)
let cropRect = CGRect(x: frame.minX/assetSize.width,
y: frame.minY/assetSize.height,
width: frame.width/assetSize.width,
height: frame.height/assetSize.height)
根据传入 Assets 的大小计算裁剪区域。然后:
// Filter
let cropFilter = GPUImageCropFilter(cropRegion: cropRect)
let url = NSURL(fileURLWithPath: "\(NSTemporaryDirectory())\(String.random()).mp4")
let movieWriter = GPUImageMovieWriter(movieURL: url, size: assetSize)
movieWriter.encodingLiveVideo = false
movieWriter.shouldPassthroughAudio = false
// add targets
movieFile.addTarget(cropFilter)
cropFilter.addTarget(movieWriter)
cropFilter.forceProcessingAtSize(frame.size)
cropFilter.setInputRotation(kGPUImageRotateRight, atIndex: 0)
电影编剧的尺寸应该是多少?它不应该是我想要裁剪的框架的大小吗?我是否应该将 forceProcessingAtSize
与我的裁剪框的大小值一起使用?
一个完整的代码示例会很棒;我已经尝试了几个小时,但似乎无法找到我想要的视频部分。
最终:
if let videoTrack = self.asset.tracks.first {
let movieFile = GPUImageMovie(asset: self.asset)
let transformedRegion = CGRectApplyAffineTransform(region, videoTrack.preferredTransform)
// Filters
let cropFilter = GPUImageCropFilter(cropRegion: transformedRegion)
let url = NSURL(fileURLWithPath: "\(NSTemporaryDirectory())\(String.random()).mp4")
let renderSize = CGSizeApplyAffineTransform(videoTrack.naturalSize, CGAffineTransformMakeScale(transformedRegion.width, transformedRegion.height))
let movieWriter = GPUImageMovieWriter(movieURL: url, size: renderSize)
movieWriter.transform = videoTrack.preferredTransform
movieWriter.encodingLiveVideo = false
movieWriter.shouldPassthroughAudio = false
// add targets
// http://stackoverflow.com/questions/37041231/gpuimage-crop-to-cgrect-and-rotate
movieFile.addTarget(cropFilter)
cropFilter.addTarget(movieWriter)
movieWriter.completionBlock = {
observer.sendNext(url)
observer.sendCompleted()
}
movieWriter.failureBlock = { _ in
observer.sendFailed(.VideoCropFailed)
}
disposable.addDisposable {
cropFilter.removeTarget(movieWriter)
movieWriter.finishRecording()
}
movieWriter.startRecording()
movieFile.startProcessing()
}
最佳答案
正如您所注意到的,GPUImageCropFilter 接受标准化坐标中的矩形。您走在正确的轨道上,因为您只需要将 X 分量(origin.x 和 size.width)除以图像宽度,将 Y 分量除以高度,将以像素为单位的 CGRect 转换为标准化坐标。
您不需要使用 forceProcessingAtSize()
,因为裁剪会自动输出适当裁剪尺寸的图像。电影作者的尺寸应与裁剪后的尺寸相匹配,您应该从原始 CGRect 中知道这一点。
您介绍的一个并发症是旋转。如果除了裁剪之外还需要应用旋转,您可能需要检查并确保不需要为裁剪区域交换 X 和 Y。如果需要交换两者,这在输出中应该很明显。
不久前在裁剪的同时应用旋转有一些错误,我不记得我是否修复了所有这些错误。如果我没有这样做,您可以在裁剪之前或之后插入一个虚拟滤镜( Gamma 或亮度设置为默认值)并在该阶段应用旋转。
关于ios - GPUImage 裁剪为 CGRect 并旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37041231/
我是 iPhone 编程的新手,目前正在开发 ballsplit 游戏。在这个游戏中,当我的子弹击中任何球时,我希望它产生两个新球。我的子弹和球都是uiimageview。 这是我的代码: if ((
有人对以下任务有好的解决方案吗? 我需要检查一个 CGRect 是否在另一个 CGRect 内部并返回一个 CGPoint,如果矩形窗口在包含的任何维度之外,它会给出偏移量。 提前致谢 最佳答案 Sw
我有一个 CGRect ,我想用 UIEdgeInsets 调整它. 似乎可能有一个内置函数可以做到这一点。我找了一个 CGRectAdjustByInsets或与其他一些功能一起使用 CGRect…
我正在尝试在 UITextField 中移动文本使其垂直对齐正确。我在网上搜索过,一切都指向编辑这些方法: - (CGRect) textRectForBounds:(CGRect)bounds 和
如何创建UnsafePointer?尝试让 mediaBoxPtr = UnsafePointer(mediaBox) 但失败了 func PDFImageData(filter: QuartzFil
在初始化 CGRect 之前,我试图查看 CGRect 是否与数组中的任何其他 CGRect 相交,但我我还没有找到有效的万无一失的方法。 请注意,交集是 CGRect 的数组。任何关于如何做到这一点
@interface some_class : some_parent { } @property (nonatomic, assign) CGRect the_rect; @end ... @im
当我使用 ReactiveCocoa 时,我想观察我的 tableView 的框架,但是出现了一个问题: __block CGRect tmp_rect; [RACObserve(self, self
我在 View 上放置了一个标签, View 的框架是CGRectMake(0,0,270,203)。现在我必须使用 CGRectMake(0,0,800,600) 截取 View 。所以我必须将标签
如何从另一个中减去一个 CGRect?我希望结果 R1 - R2 是不与 R2 相交的 R1 的最大子矩形。 示例 1: +----------------------------------+| +
大家好,我要问一个基本问题,我搜索了很多链接来解决我的问题,但没有一个没有给出确切的结果。这是我的问题: 我想传递矩形值并使用某种转换返回相同的类型,因为我编写了一种方法,但它给了我错误,我知道它可能
如何使用此方法 - (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 我
看来错误的真正原因是我试图将 Double 乘以 CGFloat。我花了一段时间通过实验才理解这一点,并更新了我的代码以使用下面 v3 的等效项,但我仍然想理解错误消息。 class MyView:
我一直断断续续地使用那种方法,但从未真正理解它们的行为方式。 每次我尝试使用它们时,我发现自己在尝试不同的方面时陷入黑暗,而且它似乎从来没有达到我期望的效果。 为了争论,我正在尝试转换从 UIKeyb
我尝试子类化 UITextField 来绘制自定义占位符。在 iOS 6 中,这工作正常,但在 iOS 7 中,我得到了不同的 CGRect 高度。 UITextField 框架是(0, 0, 500
我是 iOS 编程新手。 我正在阅读一本指南,一本意大利语版的 iOS 书籍。对于第一个应用程序,我必须像这样修改 ViewController.m: #import "ViewController.
我想将 UITableView 中 UITableViewCell subview 中对象的 CGRect “aRect” 转换为 CGRect 相对于 self.view。 问题是 aRect 是相
我试图拖动CGRect,但没有任何反应。矩形保留在同一个地方。这是我的 mouseDragged: 代码: -(void)mouseDragged:(NSEvent *)theEvent{ NSPoi
我正在声明一个按钮: let button = UIButton(frame: CGRect(x: ?, y: ?, width: 50, height: 50)) 但我记下了如何设置 x和 y相对于
我正在声明一个按钮: let button = UIButton(frame: CGRect(x: ?, y: ?, width: 50, height: 50)) 但我记下了如何设置 x和 y相对于
我是一名优秀的程序员,十分优秀!