IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Sauvegarde asynchrone d'image "Parameter is not valid"


Sujet :

C#

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Par défaut Sauvegarde asynchrone d'image "Parameter is not valid"
    Bonjour à tous !

    Lorsque je tente de sauvegarder un Stream de manière asynchrone j'obtiens une exception ArgumentException "Parameter is not valid" lors de l'utilisation de la méthode Image.FromStream.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    // Cette partie récupère la tile depuis le serveur et la
    // sauvegarde de manière asynchrone sur le disque
    BitmapImage tile = await downloadTile(name, offX, offY);
    saveCacheImage(tile.StreamSource, name);
     
    return tile;
    Voici le code de la méthode saveCacheImage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    // Sauvegarde un stream en image de manère asychrone
    private static void saveCacheImage(Stream stream, string name)
    {
         Task.Run(() =>
         {
               try
               {
                     using (Image tile = Image.FromStream(stream)) // EXCEPTION
                     {
                           tile.Save(name, ImageFormat.Png);
                     }
               }
               catch { }
         });
    }
    L'exception est générée au niveau du FromStream. A noter que l'exception est déclenchée uniquement lors de l'utilisation de l’asynchrone. Lorsque je retire le Task.Run je n'ai plus de problème.

    Après de nombreuses recherches sur les forums et divers sites, je me suis rendu compte que ce problème était très fréquent et qu'aucune solution ne marchait.

    Merci d'avance !

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour.

    Un stream sur un fichier est supposé être disposé dès que possible, j'imagine que c'est ce qui s'est produit ici. Ce qui est parfaitement normal. Il ne faut pas conserver pas le flux mais la façon d'obtenir ce flux (chemin d'accès ?).

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 39
    Par défaut
    Le truc c'est qu'il n'y a pas de chemin d'accès à une ressource, c'est un stream venant d'un serveur que je récupère sur mon client.
    J'ai essayé de copier ce stream dans un byte array au lieu de passer directement le stream, mais cela ne change rien a l'erreur, je me demande donc si cette erreur n'arrive pas simplement lorsque le stream est corrompue, et si je ne devrai pas simplement gérer l'exception lorsque cela se produit, à moins que tu ai une autre idée?
    En te remerciant.

  4. #4
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Si l'erreur ne se produit que lorsque l'appel est asynchrone, c'est bien qu'entre temps le stream a changé, c'est la seule explication possible. Parce qu'il a été disposé, ou qu'il est à la fin du flux, ou... Mais ce n'est pas une question de corruption de l'image, ou alors il ne serait pas possible de lire celle-ci dans la version synchrone du code.

    D'une façon ou d'une autre, si ça fonctionne réellement en synchrone, alors le problème est avec l'objet stream lui-même. En faire une copie avec un memorystream est une solution. S'il y a eu un pb quand tu as essayé cette solution, c'est sans doute une erreur dans ta mise en oeuvre.

    Ou alors tu t'es trompé car ça ne fonctionnait pas en synchrone. Dans ce cas le flux n'est pas un flux PNG.

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/04/2007, 17h00
  2. Réponses: 3
    Dernier message: 23/06/2006, 12h15
  3. sauvegarde d'ne image dans un fichier?
    Par waiso dans le forum OpenGL
    Réponses: 3
    Dernier message: 12/05/2006, 08h33
  4. Sauvegarde d'une image jpeg modifiée
    Par tomfoot dans le forum Composants VCL
    Réponses: 1
    Dernier message: 05/04/2006, 16h02
  5. Sauvegarde d'une image sous un autre format
    Par gandf dans le forum C++Builder
    Réponses: 4
    Dernier message: 24/02/2004, 09h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo