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?
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.
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.
https://github.com/myang-git/iOS-Image-Crop-View fait quelque chose comme ce que vous recherchez.
J'espère que cela t'aides.
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