2016-04-18 9 views
0

私はSwiftのCGImageCreateWithImageInRectを使用して、タッチ位置に画像の一部のコピーを作成しています。CGImageCreateWithImageInRect切り取り

私のコードは、ユーザーが画面の端に触れ、矩形のサイズがビューフレームの外にある場合を除いて、大きく機能します。正方形を返す代わりに、ビューの外側にある量を切り捨てて長方形を返します(私が仮定します)。この変更は、コピーされたイメージの位置をシェイプするので、下のイメージと揃っていません。

画像を整列させるために正方形の形状/サイズを維持して境界を無視するにはどうすればよいですか?ここで

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { 

    let touch = touches.first!.locationInView(mainImageView?.superview) 

    UIGraphicsBeginImageContext(self.view.bounds.size) 
    UIApplication.sharedApplication().keyWindow!.layer.renderInContext(UIGraphicsGetCurrentContext()!) 
    let screenshot = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 

    let crop = CGRectMake(touch.x - CGFloat(brushWidth)/2, touch.y - CGFloat(brushWidth)/2, CGFloat(brushWidth), CGFloat(brushWidth)) 

    let imageRef = CGImageCreateWithImageInRect(screenshot.CGImage, crop) 

    if imageRef != nil { 
     let newImage: UIImage = UIImage(CGImage: imageRef!, scale: mainImageView.image!.scale, orientation: mainImageView.image!.imageOrientation) 

       let bgImage = UIImageView(image: processedImage) 
       bgImage.center = touch 
       self.view.addSubview(bgImage) 

      } 
     } 
    } 

} 

は作業それの例である:

enter image description here

をここに私はエッジの近くに触れたので、画像をワープそれの例です。

enter image description here

+0

タッチが画像の外側で発生するかどうかを確認して、それが無視された場合は無視してください。 – BallpointBen

+0

スマートなアイデアです。私はそれについて考えましたが、技術的にはタッチはイメージの中にあります。矩形の一部が外に落ちてしまい、エッジの近くに触れるとユーザーに作図することができます。 – user4812000

+0

意味があります。 2番目の画像の黄色い矩形がシフトされた画像データを含む理由を知っていますか?長方形を左に動かすと、元の画像と線が並んでいることがわかります。 – BallpointBen

答えて

3

CGImageCreateWithImageInRect(screenshot.CGImage、crop)は実際にクロップされたバージョンを返します。ここではドキュメントから関連のコメントは以下のとおりです。

クォーツは、サブイメージを作成するには、これらのタスクを実行します。

  • は機能CGRectIntegralを呼び出すことにより、積分境界にrectパラメータで指定された領域を調整します。

  • 結果を、原点が(0,0)であり、サイズがimageパラメータで指定されたイメージのサイズと等しい場合に結果を交差させます。

  • 矩形内の最初のピクセルをサブイメージの起点として扱う結果の矩形内のピクセルを参照します。

この問題を解決する簡単な方法は、そのサイズのために正確であるように得られたUIImageViewの位置を調整することです。関連する計算は次のとおりです。

let screenshotBounds = CGRectMake(0.0, 0.0, screenshot.size.width, screenshot.size.height) 
let cropIntegral = CGRectIntegral(crop) 
let cropIntersection = CGRectIntersection(cropIntegral, screenshotBounds) 
bgImage.center = CGPoint(CGRectGetMidX(cropIntersection), CGRectGetMidY(cropIntersection)) 

cropIntersectionは、ドキュメントの最初の2つの手順に従って、抽出した画像の境界矩形です。したがって、元の画像の同じ場所にimageViewを配置するために使用することができます。

+0

完璧に動作します!私も変数を統合していただきありがとうございます! – user4812000

関連する問題