2017-10-31 5 views
1

複数のCIFilterを画像に適用していますが、2番目のフィルタを適用すると、私は、作物を作成し、以下のような機能を回転させてきました:createCGImageは、CIFilterを使用して画像を回転/トリミングしようとするとnilを返します。

func crop(_ image: CIImage) -> CIImage?{ 
    let cropRectangle = CGRect(x: 0, y: 0, width: 0.5*image.extent.width, height: 0.5*image.extent.height) 
    guard let filter = CIFilter(name: "CICrop") else {print("Could not create filter.");return nil} 
    filter.setValue(image, forKey: "inputImage") 
    filter.setValue(cropRectangle, forKey: "inputRectangle") 
    return filter.outputImage 
} 

func rotate(image: CIImage, rotation: CGFloat) -> CIImage?{ 
    guard let filter = CIFilter(name: "CIAffineTransform") else {print("Unable to generate filter");return nil} 
    let rotationTransform = CGAffineTransform.init(rotationAngle: rotation) 
    filter.setValue(image, forKey: "inputImage") 
    filter.setValue(rotationTransform, forKey: "inputTransform") 
    return filter.outputImage 
} 

私は収穫してから回転を適用する場合は、私のcontext.createCGImageが正常に動作しますが、私は回転して、作物に適用する場合、それはnilを返します。私はCIImageの.extensionをチェックしました。作図しようとしているのは、切り抜き矩形が境界内にあることを確認することです。アイデアを受け入れるここで言及したfuncttions上記2に私の呼び出しがあります:

let context = CIContext(options: nil) 
     guard let ciImage = CIImage(image: #imageLiteral(resourceName: "sample3")) else {fatalError("Error on image generation!")} 
     guard let ciRotated = self.rotate(image: ciImage, rotation: CGFloat(Double.pi*3/2)) else {print("Could not rotate.");return} 
     guard let ciCropped = self.crop(ciRotated) else {print("Error cropping.");return} 
     guard let final = context.createCGImage(ciCropped, from: ciCropped.extent) else {print("Error on CG gen.");return} 

答えて

0

問題は、回転後の画像の原点は0,0でもはやだったことなかったので、作物の四角形が範囲外、本当にだった、作物の関数の戻り値を作成します0x0サイズの画像。原点を0,0に戻すための翻訳を追加し、すべてが機能しました。ここ 同様の問題:私が作成したCore Image: after using CICrop, applying a compositing filter doesn't line up

翻訳機能:

func translation(image: CIImage, x: CGFloat, y: CGFloat) -> CIImage?{ 
    guard let filter = CIFilter(name: "CIAffineTransform") else {print("Unable to generate filter"); return nil} 
    let translate = CGAffineTransform.init(translationX: x, y: y) 
    filter.setValue(image, forKey: "inputImage") 
    filter.setValue(translate, forKey: "inputTransform") 
    return filter.outputImage 
} 

この例への最終コール:

  let context = CIContext(options: nil) 
     guard let ciImage = CIImage(image: #imageLiteral(resourceName: "sample3")) else {fatalError("Error on image generation!")} 
     guard let ciRotated = self.rotate(image: ciImage, rotation: CGFloat(Double.pi*3/2)) else {print("Could not rotate.");return} 
     guard let ciTranslated = self.translation(image: ciRotated, x: 0, y: ciRotated.extent.height) else {print("Unable to translate."); return} 
     guard let ciCropped = self.crop(ciTranslated) else {print("Error cropping.");return} 
     guard let final = context.createCGImage(ciCropped, from: ciCropped.extent) else {print("Error on CG gen.");return} 
関連する問題