【发布时间】:2017-07-11 20:45:13
【问题描述】:
我正在为 CI 过滤器创建演示应用程序,并且几乎应用了所有类别的所有过滤器。但是当我尝试在 CICategoryTileEffect 中添加过滤器时,所有过滤器都返回 nil 图像,除了“CIKaleidoscope”。所有其他过滤器都崩溃了。显示代码是类的一部分。
enum EN_TileEffect :String
{
case affineClamp = "AffineClamp"
case affineTile = "AffineTile"
case eightfoldReflectedTile = "EightfoldReflectedTile"
case fourfoldReflectedTile = "FourfoldReflectedTile"
case fourfoldRotatedTile = "FourfoldRotatedTile"
case fourfoldTranslatedTile = "FourfoldTranslatedTile"
case kaleidoscope = "Kaleidoscope"
case opTile = "OpTile"
case parallelogramTile = "ParallelogramTile"
case perspectiveTile = "PerspectiveTile"
case sixfoldReflectedTile = "SixfoldReflectedTile"
case triangleKaleidoscope = "TriangleKaleidoscope"
case triangleTile = "TriangleTile"
case twelvefoldReflectedTile = "TwelvefoldReflectedTile"
}
class TileEffect {
fileprivate static var filter : CIFilter!
fileprivate static var context : CIContext = CIContext(options:nil)
static func applyFilter(filter: EN_TileEffect , image: UIImage) -> UIImage {
switch filter {
case .affineClamp: return affineClamp(image: image)
case .kaleidoscope: return kaleidoscope(image: image)
default : return image
}
}
//Just working fine and as expected
fileprivate static func kaleidoscope(image:UIImage) -> UIImage {
let originalImage = CIImage(cgImage: (image.cgImage)!)
let orientation = (image.imageOrientation)
filter = CIFilter(name: "CIKaleidoscope")
filter?.setValue(originalImage, forKey: kCIInputImageKey)
filter?.setValue(CIVector(x:120,y:120), forKey: kCIInputCenterKey)
filter?.setValue(0, forKey: kCIInputAngleKey)
filter?.setValue(2, forKey: "inputCount")
let cgimg = context.createCGImage(filter!.outputImage!, from: filter!.outputImage!.extent)
return UIImage(cgImage: cgimg!, scale: 1.0, orientation: orientation)
}
// This method could not generate a new image and crashing every time.
fileprivate static func affineClamp(image:UIImage) -> UIImage {
let originalImage = CIImage(cgImage: (image.cgImage)!)
let orientation = (image.imageOrientation)
filter = CIFilter(name: "CIAffineClamp")
filter?.setValue(originalImage, forKey: kCIInputImageKey)
let transform = CGAffineTransform.identity
let val = NSValue(cgAffineTransform: transform)
filter.setValue(val, forKey: "inputTransform")
**//Always returning nil image here**
let cgimg = context.createCGImage(filter!.outputImage!, from: filter!.outputImage!.extent)
return UIImage(cgImage: cgimg!, scale: 1.0, orientation: orientation)
}
}
我搜索了很多,但没有找到任何解决方案或工作示例。
【问题讨论】:
-
您是否尝试在函数内移动“过滤器:CIFilter”
-
如果编写的代码有效,您能否展示您的原始图像,以及您对“CIAffineClamp”过滤器的预期结果?
-
stackoverflow.com/questions/12910625/… 的可能重复项 - CIAffineClamp 过滤器生成“无限范围”的图像,因此您必须在创建目标图像时使用 源 范围(或传递显式大小)。
-
让我尝试扩展原图
-
它现在以原始范围返回图像,但我没有得到完整的图像,我得到了图像的一部分。
标签: ios swift3 core-image cifilter xcode8.2