2015-07-06 18 views
13

Sto provando a creare un'app iOS utilizzando Swift per acquisire immagini e consentire all'utente di salvare una porzione selezionata dell'immagine. In molte app basate su webcam, ho notato che una cornice rettangolare è offerta per consentire agli utenti di scegliere la porzione desiderata. Ciò comporta lo spostamento dei bordi del rettangolo o lo spostamento degli angoli per adattarsi all'area richiesta.Come selezionare una porzione di un'immagine, ritagliare e salvarla utilizzando Swift?

Potresti per favore guidarmi su come implementare quel rettangolo mobile e come salvare solo quel pezzo di immagine?

risposta

9

Trovato un'altra soluzione. Questa volta è in Swift. La soluzione sembra elegante e il codice relativo ad altre soluzioni simili è scritto in un numero minore di righe.

Eccolo .. https://github.com/DuncanMC/CropImg Grazie a Duncan Champney per fare il suo lavoro disponibile su GitHub.

+0

Questo non è stato aggiornato per Xcode 8/Swift 3 quindi non funziona. –

6

https://github.com/myang-git/iOS-Image-Crop-View fa qualcosa di simile a quello che stai cercando ..

Spero che questo aiuti.

+1

la soluzione si adatta con precisione offerto la mia richiesta, ma è in Objective-C, cercherò neanche di codice in Swift o di preparare un file di intestazione per il bridging. Grazie Subbu hai salvato il mio prezioso tempo. Apprezzo sinceramente Ming Yang, che ha pubblicato questa soluzione su GitHub. – Sriram

+0

Menzione non disponibile .. –

+1

c'è una versione veloce di questa soluzione? –

17

Utilizzando Swift 3

Immagine di ritaglio può essere fatto utilizzando CGImages da CoreGraphics.

Prendi la versione CGImage di un UIImage come questo:

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

oggetti CGImage hanno un metodo ritaglio (a: CGRect) che fa il ritaglio:

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

Infine, riconvertire da CGImage a UIImmagine:

let uiImage = UIImage(cgImage: croppedCGImage) 

funzione Esempio:

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

L'attributo CGRect del ritaglio definisce la 'coltivazione rettangolo' dentro l'immagine che verrà ritagliata.

+0

perché questa risposta non è contrassegnata come quella giusta? Funziona questo codice? –

+0

Dovrebbe essere la risposta corretta, principalmente a causa del codice nativo e senza librerie di terze parti – murphguy

+0

Cosa dobbiamo scrivere invece dell'argomento CGRect? Sono un po 'confuso –

0

Se riscontri problemi come la rotazione di 90 dopo aver ritagliato l'immagine, prova questo.
Conservare la scala dell'immagine originale e la proprietà di orientamento per un uso successivo

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

Prendi il CGImage da UIImage:

let cgImage = image.cgImage 

Passare l'area cropArea (CGRect) da ritagliare (in caso si sta utilizzando IMAGEVIEW .immagine che hai trova la scala e fare la matematica per trovare CGRect) aggiungendo che il codice qui sotto, se necessario

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

bisogno di contesto per il rendering di immagini (è un processo pesante fare controllare https://developer.apple.com/documentation/coreimage/cicontext se si sta facendo più volte) di utilizzare questo è possibile impostare la scala e l'orientamento che abbiamo creato in prima linea in modo immagine non ruotano 90

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