2017-07-10 9 views
0

私はCIフィルタのデモアプリケーションを作成しており、ほとんどすべてのカテゴリのすべてのフィルタが適用されています。しかし、CICategoryTileEffectでフィルタを追加しようとすると、すべてのフィルタが "CIKaleidoscope"を除いてnilイメージを返しています。その他のフィルタはすべてクラッシュしています。コードを示すのはクラスの一部です。Core Image SwiftのTileEffectフィルタがnil画像を返しています

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) 
    } 
} 

私は多くを検索しましたが、解決策や実際の例は見つかりませんでした。

+0

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

から私の問題 を解決しますが、「フィルタ:CIFilter」を移動してみたの交換機能 – zombie

+0

の内側にあなたの元画像が表示され、あなたはと期待できます"CIAffineClamp"フィルタの結果、もし書かれたコードがうまくいけば? – DonMag

+0

https://stackoverflow.com/questions/12910625/cigaussianblur-and-ciaffineclamp-on-ios-6の可能な複製 - CIAffineClampフィルタは「無限エクステント」のイメージを生成するので、*ソース*エクステントを使用する必要がありますターゲットイメージを作成する(または明示的なサイズを渡す) –

答えて

0

ありがとうございます。 1行のコードが

let cgimg = context.createCGImage(filter!.outputImage!, from: originalImage.extent) 
関連する問題