【问题标题】:Core Image TileEffect filters in swift are returning nil imageswift中的Core Image TileEffect过滤器正在返回nil图像
【发布时间】: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


【解决方案1】:

谢谢大家。替换一行代码解决了我的问题 来自

let cgimg = context.createCGImage(filter!.outputImage!, from: filter!.outputImage!.extent)

 let cgimg = context.createCGImage(filter!.outputImage!, from: originalImage.extent)

【讨论】:

    猜你喜欢
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2021-11-19
    • 2016-12-22
    • 2023-03-29
    • 2018-05-09
    相关资源
    最近更新 更多