[Résolu] Enregistrer une image inclinée dans le DocumentDirectory

busterTheobusterTheo Membre
octobre 2015 modifié dans API UIKit #1

Bonjour,


voilà  comment j'enregistre une image :



let imagePickee: UIImage = info[UIImagePickerControllerOriginalImage] as! UIImage

let screenSize: CGSize = UIScreen.mainScreen().bounds.size

let newImageScaled: UIImage = scaledImageWithImage(imagePickee, size: CGSize(width: screenSize.width, height: screenSize.height))

let documentsDir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true)[0] as! String
let pathFull: NSString = documentsDir + "/" + "nomImage"

let pngFullData: NSData = UIImagePNGRepresentation(newImageScaled)
pngFullData.writeToFile(pathFull as String, atomically: true)

Je récupère ensuite l'image ainsi :



let documentsDir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true)[0] as! String

let pathFull: NSString = documentsDir + "/" + "nomImage"

if let uneImage:UIImage = UIImage(contentsOfFile: pathFull as String) {
self.imageViewEtapes.image = uneImage
}

Puis je lui applique une orientation à  la main (avec des poignées ou un slider, peu importe).


Je parviens à  la réafficher, inclinée.


 


Mais j'aurai besoin de ne pas avoir à  la ré-incliner à  chaque fois que je l'affiche.


 


J'aimerai d'abord la ré-enregistrer (genre avec un updateToFile) déjà  inclinée, pour ensuite l'afficher sans l'incliner (puisqu'elle le sera déjà ).


 


J'espère être clair.


 


J'ai cherché partout, je ne trouve rien qui me concerne.


 


Merci d'avance.


 


Réponses

  • Tu n'as pas besoin d'enregistrer l'image inclinée, juste de sauvegarder son inclinaison. Et d'incliner le container  (un UIImageView je présume) à  l'affichage.

  • CéroceCéroce Membre, Modérateur

    Tu pourrais dessiner l'image dans un CGBitmapContext dont tu aurais modifié la matrice de transformation, et ensuite convertir le CGBitmapContext en CGImage pour l'enregistrer. Cependant, je suis d'accord avec Draken: pourquoi ne pas simplement noter l'angle de la rotation dans le fichier ?


  • C'est ce que je fais depuis le début, mais je combine cela avec le zoom, donc avec les trasforrm, et je galère cher.


    Cela fait plusieurs fois que j'essaie en repensant la chose, mais ça déconne grave.


    C'est pour ça que j'aimerai l'enregistrée inclinée.


     


    Voici un bout de code :



    func configOrientationPhoto(angleRotation: String, imageNumero: Int, lz: CGFloat, lx: CGFloat, ly: CGFloat) {

    xOrientationsValue = lx
    yOrientationsValue = ly
    zoomingOrientationsValue = lz
    angleOrientationsStringValue = angleRotation

    self.viewFille1Etapes.zoomScale = zoomingOrientationsValue

    if angleOrientationsStringValue != "" {
    angleOrientationsValue = floor(CGFloat((angleOrientationsStringValue as NSString).doubleValue)*100)/100

    if angleOrientationsValue != 0.0 {
    rotateImage(imgOrientation, angleRotation: angleOrientationsValue, lz: zoomingOrientationsValue)
    } else {
    angleOrientationsValue = 0.0
    rotateImage(imgOrientation, angleRotation: 0.0, lz: zoomingOrientationsValue)
    }
    } else {
    angleOrientationsValue = 0.0
    rotateImage(imgOrientation, angleRotation: 0.0, lz: zoomingOrientationsValue)
    }

    if zoomAction == 0 {
    centerScrolleViewContentsOrig()
    self.viewFille1Etapes.bounds.origin.x = xOrientationsValue
    self.viewFille1Etapes.bounds.origin.y = yOrientationsValue
    } else {
    zoomAction = 0
    } }

    func rotateImage(sourceImage: UIImage, angleRotation: CGFloat, lz: CGFloat) {
    let degreesToRadians: (CGFloat) -> CGFloat = {
    return $0 / 180.0 * CGFloat(M_PI)
    }

    if angleRotation != 0.0 {
    var transform = CGAffineTransformMakeRotation(-degreesToRadians(angleRotation))
    let newZoom = lz * 1.01182996261694
    transform = CGAffineTransformScale(transform, newZoom, newZoom)
    imageViewEtapes.transform = transform
    }
    }

    func centerScrolleViewContentsOrig() {
    let boundsSize = viewFille1Etapes.bounds.size
    var contentsFrame = imageViewEtapes.frame

    if contentsFrame.size.width < boundsSize.width {
    contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2
    } else {
    contentsFrame.origin.x = 0
    }

    if contentsFrame.size.height < boundsSize.height {
    contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2
    } else {
    contentsFrame.origin.y = 0
    }

    imageViewEtapes.frame = contentsFrame
    }

    Puis



    // MARK: - ScrollVieuw Delegate Methods

    func scrollViewDidZoom(scrollView: UIScrollView) {
    // centerScrolleViewContentsOrig()
    }

    func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {
    zoomAction = 1
    zoomingOrientationsValue = self.viewFille1Etapes.zoomScale
    xOrientationsValue = self.viewFille1Etapes.bounds.origin.x
    yOrientationsValue = self.viewFille1Etapes.bounds.origin.y
    configOrientationPhoto(angleOrientationsStringValue, imageNumero: imageNumeroValue, lz: zoomingOrientationsValue, lx: xOrientationsValue, ly: yOrientationsValue)
    }

    func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
    return imageViewEtapes
    }

    func scrollViewWillBeginDragging(scrollView: UIScrollView) {
    }

    func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    xOrientationsValue = self.viewFille1Etapes.bounds.origin.x
    yOrientationsValue = self.viewFille1Etapes.bounds.origin.y
    }
  • Cherche "swift uiview snapshot" sur google, tu trouveras des topics sur la manière de récupérer le contenu d'une vue dans une image bitmap.

  • Ah ouais Draken, ça a l'air pas mal ce truc. Merci.


    Je vais essayer.


  • Un grand merci, Draken.


    C'est génial.


    ça marche impeccable.


     


    Par contre sur ipad, il me fait une image toute noire.


    Pourtant, le fichier est bien enregistré.


     


    J'ai cherché partout, et je ne trouve rien de probant.


     


    Voici mon code, si quelqu'un a une idée.



    func enregistrerInclinaison() {
    let snapshotView:UIView = viewPorteuseOrientation.snapshotViewAfterScreenUpdates(true)
    UIGraphicsBeginImageContextWithOptions(viewPorteuseOrientation.bounds.size, true, 0.0)
    snapshotView.drawViewHierarchyInRect(viewPorteuseOrientation.bounds, afterScreenUpdates: true)

    if let imageGet :UIImage = UIGraphicsGetImageFromCurrentImageContext() {
    UIGraphicsEndImageContext()
    let documentsDir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true)[0] as! String
    let pathFull: NSString = documentsDir + "/Inclinee" + imageTransmiseString
    if let pngFullData: NSData = UIImagePNGRepresentation(imageGet) {
    pngFullData.writeToFile(pathFull as String, atomically: true)
    }
    }
    }
Connectez-vous ou Inscrivez-vous pour répondre.