2015-07-06 14 views
13

Ich versuche eine iOS-App mit Swift zu erstellen, um Bilder aufzunehmen und den Benutzer einen ausgewählten Teil des Bildes speichern zu lassen. In vielen cam-basierten Apps habe ich festgestellt, dass ein rechteckiger Rahmen angeboten wird, damit der Benutzer den gewünschten Teil auswählen kann. Dazu müssen Sie entweder die Kanten des Rechtecks ​​verschieben oder die Ecken an den gewünschten Bereich anpassen.Wie kann man einen Teil eines Bildes auswählen, zuschneiden und mit Swift speichern?

Könnten Sie mir bitte erklären, wie Sie dieses bewegliche Rechteck implementieren und wie Sie nur diesen Teil des Bildes speichern?

Antwort

9

Eine weitere Lösung gefunden. Diesmal ist es in Swift. Die Lösung sieht elegant aus und der Code relativ zu anderen solchen Lösungen wird in weniger Zeilen geschrieben.

Hier ist es .. https://github.com/DuncanMC/CropImg Dank Duncan Champney für auf Github seine Arbeit zur Verfügung stellen.

+0

Dies wurde nicht für Xcode 8/Swift 3 aktualisiert, so dass es nicht funktioniert. –

6

https://github.com/myang-git/iOS-Image-Crop-View tut etwas wie das, was Sie suchen, ..

Hoffnung, das hilft.

+1

die Lösung, die Sie genau meine Anforderungen entspricht angeboten, jedoch ist es in Objective-C, werde ich versuchen, sie entweder in Swift zu codieren oder Bereiten Sie eine Bridging-Header-Datei vor. Dank Subbu hast du meine kostbare Zeit gerettet. Ich schätze Ming Yang, der diese Lösung auf GitHub veröffentlicht hat. – Sriram

+0

Erwähnen Sie nicht bro .. –

+1

gibt es eine schnelle Version dieser Lösung? –

17

Mit Swift 3

Bild beschneiden kann CGImages von Core Graphics mit getan werden.

// cgImage is an attribute of UIImage 
let cgImage = image.cgImage 

CGImage Objekte haben eine Methode Zuschneiden (zu: CGRect) das tut das Zuschneiden:

die CGImage Version eines UIImage wie dies endlich

let croppedCGImage: CGImage = cgImage.cropping(to: toRect) 

, zurück konvertieren von CGImage bis UIImage:

let uiImage = UIImage(cgImage: croppedCGImage) 

Beispiel Funktion:

func cropImage(image: UIImage, toRect: CGRect) -> UIImage? { 
    // Cropping is available trhough CGGraphics 
    let cgImage :CGImage! = image.cgImage 
    let croppedCGImage: CGImage! = cgImage.cropping(to: toRect) 

    return UIImage(cgImage: croppedCGImage) 
} 

Das CGRect Attribut definiert das Beschneiden 'Zuschneiderechteck' innerhalb des Bildes, das abgeschnitten werden soll.

+0

Warum wird diese Antwort nicht als richtig markiert? Funktioniert dieser Code? –

+0

Sollte die richtige Antwort sein, vor allem aufgrund des systemeigenen Codes und keine Drittanbieter-Bibliotheken – murphguy

+0

Was haben wir anstelle des Arguments CGRect schreiben? Ich bin ein wenig verwirrt –

0

Wenn Sie das Problem haben, 90 nach dem Beschneiden zu drehen, versuchen Sie es.
Bewahren Sie das Originalbild Skala und Orientierungseigenschaften für eine spätere Verwendung

let imgOrientation = image?.imageOrientation 
let imgScale = image?.scale 

die CGImage von UIImage Get:

let cgImage = image.cgImage 

Pass die cropArea (CGRect) Bereich, den Sie zuschneiden möchten (sofern Sie Imageview verwenden .Bild haben Sie die Skala und tun Mathe finden CGRect zu finden) fügte hinzu, dass folgende Code benötigt, wenn

let croppedCGImage = cgImage.cropping(to: cropArea) 
let coreImage = CIImage(cgImage: croppedCGImage!) 

Kontext benötigen für die Bildwiedergabe (es ist ein schwerer Prozess https://developer.apple.com/documentation/coreimage/cicontext Sie überprüfen, ob Sie mehrere Male tun) diese verwenden Sie können setzen den Maßstab und Orientierung wir in erster Linie geschaffen, um nicht mehr als 90 Bild drehen sich

let ciContext = CIContext(options: nil) 
let filteredImageRef = ciContext.createCGImage(coreImage, from: coreImage.extent) 
let finalImage = UIImage(cgImage:filteredImageRef!, scale:imgScale!, orientation:imgOrientation!) 
imageView.image = finalImage 
Verwandte Themen