2016-04-18 22 views
0

ich CGImageCreateWithImageInRect in Swift bin mit einer Kopie eines Teils eines Bildes an der Berührungsstelle zu schaffen.CGImageCreateWithImageInRect das Abschneiden

Mein Code funktioniert gut, außer wenn der Benutzer den Rand des Bildschirms und die rect Größe fällt nicht in den Ansichtsrahmen. Anstatt ein Quadrat zurückzugeben, gibt es ein Rechteck zurück (ich nehme an), dass die Menge, die außerhalb der Ansicht liegt, abgeschnitten wird. Die Änderung ist, dass die Form die Position des kopierten Bilds verlässt, sodass sie nicht mit dem unteren Bild übereinstimmt.

Wie halte ich die quadratische Form/Größe und die Grenzen ignorieren, so meine Bilder ausrichten? Hier

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) 

      } 
     } 
    } 

} 

ist ein Beispiel davon arbeiten:

enter image description here

Hier ist ein Beispiel für den Image Warping, weil ich in der Nähe der Kante berühren:

enter image description here

+0

Könnten Sie einfach überprüfen, ob die Berührung außerhalb des Bildes auftritt, und es ignorieren, wenn es tut? – BallpointBen

+0

Es ist eine kluge Idee. Ich habe darüber nachgedacht, aber technisch ist die Berührung innerhalb des Bildes. Ein Teil des Rect fällt einfach nach draußen und ich möchte dem Benutzer immer noch die Möglichkeit geben zu beschneiden, wenn sie sich in der Nähe der Kante berühren. – user4812000

+0

Sinn macht. Weißt du, warum das gelbe Rechteck im zweiten Bild verschobene Bilddaten enthält? Sie können sehen, dass das Originalbild und das Originalbild ausgerichtet sind, wenn Sie das Rechteck nach links verschoben haben. – BallpointBen

Antwort

3

CGImageCreateWithImageInRect (screenshot.CGImage, crop) gibt tatsächlich eine beschnittene Version zurück. Hier ist der relevante Kommentar aus der Dokumentation:

Quartz diese Aufgaben führt die Unter-Bild zu erstellen:

  • Stellt den Bereich, der durch den Parameter rect zu integralen Grenzen spezifiziert durch die Funktion CGRectIntegral aufrufen.

  • Durchschneidet das Ergebnis mit einem Rechteck, dessen Ursprung (0,0) ist und dessen Größe der Größe des vom Bildparameter angegebenen Bildes entspricht.

  • Verweist auf die Pixel im resultierenden Rechteck, wobei das erste Pixel innerhalb des Rechtecks ​​als Ursprung des Unterbildes behandelt wird.

Ein einfacher Weg, dies zu lösen, ist die Position des resultierenden UIImageView anzupassen, so dass es für seine Größe korrekt ist. Hier ist die entsprechende Berechnung:

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 ist das Begrenzungsrechteck der extrahierten Bild (im Anschluss an den ersten beiden Schritten in der Dokumentation angegeben). Daher können wir das ImageView an derselben Stelle im Originalbild positionieren.

+0

Funktioniert perfekt! Ich schätze es auch, dass Sie meine Variablen integrieren! – user4812000