web-dev-qa-db-fra.com

Comment sélectionner une partie d'une image, la rogner et la sauvegarder avec Swift?

J'essaie de créer une application iOS en utilisant Swift pour capturer des images et permettre à l'utilisateur d'enregistrer une partie sélectionnée de l'image. Dans de nombreuses applications basées sur les caméras, j'ai remarqué qu'un cadre rectangulaire permet aux utilisateurs de choisir la portion souhaitée. Cela implique de faire glisser les bords du rectangle ou de déplacer les coins pour s’adapter à la zone requise.

Pourriez-vous s'il vous plaît me guider sur la façon de mettre en œuvre ce rectangle mobile et comment enregistrer uniquement cette partie de l'image?

16
Sriram

Trouvé une solution de plus. Cette fois c'est à Swift. La solution semble élégante et le code par rapport à d’autres solutions est écrit en moins de lignes.

Voici .. https://github.com/DuncanMC/CropImg Merci à Duncan Champney pour avoir rendu son travail disponible sur github.

10
Sriram

Utilisation de Swift 3

Le recadrage des images peut être effectué à l'aide de CGImages from CoreGraphics .

Obtenez la version CGImage d'un UIImage comme ceci:

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

Les objets CGImage ont une méthoderecadrage (vers: CGRect)qui effectue le recadrage:

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

Enfin, reconvertissez de CGImage à UIImage :

let uiImage = UIImage(cgImage: croppedCGImage)

Exemple de fonction:

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'attribut CGRect du recadrage définit le "rectangle de recadrage" à l'intérieur de l'image qui sera recadrée.

26
Paulo

https://github.com/myang-git/iOS-Image-Crop-View fait quelque chose comme ce que vous recherchez. 

J'espère que cela t'aides.

7
Subbu

Si vous rencontrez un problème tel que la rotation de 90 après le recadrage, essayez ceci.
Stocke la propriété d’échelle et d’orientation de l’image originale pour une utilisation ultérieure

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

Obtenez le CGImage de UIImage:

let cgImage = image.cgImage

Passez la zone cropArea (CGRect) que vous souhaitez recadrer (si vous utilisez imageView.image vous avez trouvé l’échelle et faites les calculs pour trouver cgRect) en ajoutant le code ci-dessous si nécessaire.

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

Besoin de contexte pour le rendu de l'image (son processus est lourd, vérifiez https://developer.Apple.com/documentation/coreimage/cicontext si vous le faites plusieurs fois), vous pouvez définir l'échelle et l'orientation créées première ligne pour que l'image ne tourne pas 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
0
Iraniya Naynesh