Comment faire pivoter l'image dans Swift?
Je suis incapable de faire pivoter l'image de 90 degrés dans swift. J'ai écrit du code ci-dessous mais il y a une erreur et ne compile pas
func imageRotatedByDegrees(oldImage: UIImage, deg degrees: CGFloat) -> UIImage {
//Calculate the size of the rotated view's containing box for our drawing space
let rotatedViewBox: UIView = UIView(frame: CGRect(x: 0, y: 0, width: oldImage.size.width, height: oldImage.size.height))
let t: CGAffineTransform = CGAffineTransform(rotationAngle: degrees * CGFloat(M_PI / 180))
rotatedViewBox.transform = t
let rotatedSize: CGSize = rotatedViewBox.frame.size
//Create the bitmap context
UIGraphicsBeginImageContext(rotatedSize)
let bitmap: CGContext = UIGraphicsGetCurrentContext()!
//Move the origin to the middle of the image so we will rotate and scale around the center.
bitmap.translateBy(x: rotatedSize.width / 2, y: rotatedSize.height / 2)
//Rotate the image context
bitmap.rotate(by: (degrees * CGFloat(M_PI / 180)))
//Now, draw the rotated/scaled image into the context
bitmap.scaleBy(x: 1.0, y: -1.0)
bitmap.draw(oldImage, in: CGRect(origin: (x: -oldImage.size.width / 2, y: -oldImage.size.height / 2, width: oldImage.size.width, height: oldImage.size.height), size: oldImage.cgImage))
let newImage: UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return newImage
}
ci-dessous est le code je ne suis pas sûr de
bitmap.draw(oldImage, in: CGRect(origin: (x: -oldImage.size.width / 2, y: -oldImage.size.height / 2, width: oldImage.size.width, height: oldImage.size.height), size: oldImage.cgImage))
- Gérer la condition de l'image après la prise de vue de la caméra. Et essayez ce lien: stackoverflow.com/questions/9324130/... Il va l'aider à régler la question.
- stackoverflow.com/a/33479054/291240
- Lorsque vous obtenez des erreurs, n'oubliez jamais de dire aux gens quels qu'ils soient!
Vous devez vous connecter pour publier un commentaire.
C'est une extension de
UIImage
que les objectifs Swift 4.0 et peut pivoter juste l'image sans avoir besoin d'unUIImageView
. Testé avec succès que l'image a été tourné, et pas juste ses données exif changé.Pour effectuer une rotation de 180 degrés, vous pouvez l'appeler comme ceci:
Si, pour quelque raison que ce soit, il ne parvient pas à faire pivoter l'image d'origine sera alors retourné.
let rotatedImage = image.rotate(radians: .pi)
. L'image est 1433 × 2099. J'ai ensuite trouvé une autre solution qui fonctionne parfaitement: stackoverflow.com/a/47402811/529663ensemble ImageView image
CGFloat.pi
constante (divisé par 2 ofc).pi/1
pour 180 et.pi/2
pour 90UIView.animate(withDuration: 3) { self.needleImageView.transform = self.needleImageView.transform.rotated(by: CGFloat(Double.pi/2)) }
En une seule ligne:
Dans Swift Xcode 4.2 et 10.0
Si vous souhaitez ajouter une animation...
Vous pouvez utiliser le code ci-dessous pour Swift 3:
Rotation de l'image via UIGraphics Contexte est relativement lourde opération. Les problèmes que vous pourriez vu de perdre de la qualité et de la mémoire augmente.
Je suggère que vous devriez essayer de faire pivoter le calque ou la vue elle-même.
Comment utiliser
Votre code n'est pas loin de la fonctionnelle. Vous pouvez appliquer la transformation comme vous le faites directement à l'image, vous n'avez pas besoin d'un point de vue intermédiaire:
Aussi, si vous allez créer une fonction qui fait pivoter une image, il est généralement une bonne forme pour inclure un
clockwise: Bool
paramètre qui va interpréter ledegrees
argument que la rotation des aiguilles d'une montre ou pas. La mise en œuvre appropriée et conversion en radians que je vous laisse.Noter également que c'est un peu de la main-ondulée pour ma part, à supposer que
oldImage.size
est non nul. Si elle l'est, la force d'ôterUIGraphicsGetCurrentContext()!
sera probablement planter. Vous devez valider leoldImage
's la taille et si c'est non valide juste retouroldImage
.Vous pouvez tout d'abord définir votre image dans imageView et faire pivoter obtenir votre image dans imageView
Ici:
Votre problème est que vous utilisez la non-existence d'initialiseur pour CGRect. Si vous souhaitez utiliser CGRect(origine:taille:), puis créer l'origine correctement, sans paramètres largeur et hauteur. Ou supprimer paramètre de taille et de l'utilisation CGRect(x:y:largeur:hauteur:).
Il suffit de remplacer cette ligne
avec celui-ci:
Swift 4.2
Rotation à droite. Fonctionne très bien.