[Résolu] BeginImageContext sur Ipad

busterTheobusterTheo Membre
octobre 2015 modifié dans API UIKit #1

Bonjour,


comme je le disais dans un autre post, je suis parvenu grâce à  Draken à  faire ce que je voulais.


 


Le problème, et je m'excuse de revenir à  la charge, est que ça déconne sur ipad.


 


En gros je prend un snapshot et j'enregistre l'image.


Ok sur le simulator, mais image (ce sont des vrais pixels) toute noire.


 


Si quelqu'un pouvait m'aider, ce serait super.


 


Merci d'avance.



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

Réponses

  • Alors là , je vois que personne ne connait ce problème.


     


    ça veut dire que le plan snapShot, c'est d'la daube ?


  • Perso, ayant un peu suivi ton problème, je pense que sauvegarder l'image après rotation n'est pas la bonne solution. Sauvegarder l'image normale et l'angle à  appliquer, voilà  ce que je ferai.


    Ce qui ne répond pas à  ta question, j'en conviens !
  • CéroceCéroce Membre, Modérateur

    Je pense que le problème est que tu ne sais pas quel est le Graphics Context courant.


    - UIGraphicsBeginImageContextWithOptions() crée le contexte, mais ne le rend pas courant d'après la doc.


    - snapshotView.drawViewHierarchyInRect() change-t-elle le contexte courant?


    - UIGraphicsGetImageFromCurrentImageContext() -> Le contexte courant n'est peut-être pas le contexte offscreen créé plus haut.


  • Merci pour votre retour.


     


    Pas bète l'histoire du contexte pas courant, mais pourquoi ça marche sur le simulateur ?


  • Essaye:



    UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, [[UIScreen mainScreen] scale]);
    {
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    image = UIGraphicsGetImageFromCurrentImageContext();

    }
    UIGraphicsEndImageContext();
  • DrakenDraken Membre
    octobre 2015 modifié #7

    Le problème vient peut-être de la sauvegarde de l'image sur le device. J'ai écrit un micro-exemple pour tester le snapshot entièrement en mémoire.


    Il commence par afficher une image dans une UIImageView. Si l'utilisateur touche l'écran du doigt, l'application réalise un snapshot de la vue pour l'afficher dans une autre UIImageView. 



    class ViewController: UIViewController {

    let vue1 = UIImageView()
    let vue2 = UIImageView()
    var snapshot:UIImage?

    override func viewDidLoad() {
    super.viewDidLoad()

    let size = self.view.bounds.size
    self.creerInterface(size)

    vue1.image = UIImage(named: "unChat")

    }

    func creerInterface(sizeEcran:CGSize) {
    //
    let hautEcran = CGRectMake(0, 0, sizeEcran.width, sizeEcran.height*0.5)
    let basEcran = CGRectMake(0, sizeEcran.height*0.5, sizeEcran.width, sizeEcran.height*0.5)
    vue1.frame = hautEcran
    vue2.frame = basEcran
    self.view.addSubview(vue1)
    self.view.addSubview(vue2)
    }

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    //
    // Créer snapshot
    UIGraphicsBeginImageContext(vue1.bounds.size)
    vue1.layer.renderInContext(UIGraphicsGetCurrentContext()!)
    snapshot = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext();

    // Afficher snapshot
    vue2.image = snapshot
    }

    }


    Cela fonctionne sur :


    - le simulateur


    - mon iPhone 4 (iOS 7.1)


    - mon iPod Touch 5G (iOS 8.1)


    Désolé je n'ai pas d'iPad pour tester.


     


    On a deux chats pour le prix d'un, l'original et sa copie.


     



     


  • Voilà  un code qui fonctionne aussi sur l'iPad.


    T'as raison pour le context, j'en suis certain, mais je comprend pas tout. Pas grave.



    func enregistrerInclinaison() {
    UIGraphicsBeginImageContextWithOptions(viewPorteuseOrientation.bounds.size, true, 0.0)
    viewPorteuseOrientation.drawViewHierarchyInRect(viewPorteuseOrientation.bounds, afterScreenUpdates: true)

    if let imageGet :UIImage = UIGraphicsGetImageFromCurrentImageContext() {
    UIGraphicsEndImageContext()
    let documentsDir = NSSearchPathForDirectoriesInDomains(.DocumentDirectory,.UserDomainMask, true)[0] as! String
    let pathFull: NSString = documentsDir + "/Inc" + imageTransmiseString

    if let pngFullData: NSData = UIImagePNGRepresentation(imageGet) {
    pngFullData.writeToFile(pathFull as String, atomically: true)
    blablabla

    Merci beaucoup pour votre participation.


     


    Je met résolu.


Connectez-vous ou Inscrivez-vous pour répondre.