locked
Erreur lors de l'enregistrement d'une image provenant du web dans l'IsolatedStorage RRS feed

  • Question

  • Bonsoir :)

    Je me heurte à un petit soucis de codage, au niveau de l'enregistrement d'image provenant du web dans mon IsolatedStorage.
    Lorsque je veux créer une  WriteableBitmap depuis une image BitmapImage créée à partir d'une Uri, j'ai une erreur NullReferenceException : Invalid Pointer

    Sauf que je vois pas comment la régler :S

    public static void setImage(string serie, string url){
            // Create a filename for JPEG file in isolated storage.
                serie += ".jpg";
     
                // Create virtual store and file stream. Check for duplicate tempJPEG files.
                using (IsolatedStorageFile myIsolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
                {
                    if (myIsolatedStorage.FileExists(serie))
                    {
                         //myIsolatedStorage.DeleteFile(serie);
                    }
                    else
                    {
    
                        IsolatedStorageFileStream fileStream = myIsolatedStorage.CreateFile(serie);
    
                        BitmapImage bitmap = new BitmapImage(new Uri(url, UriKind.Absolute));
                        WriteableBitmap wb = new WriteableBitmap(bitmap);
    
                        // Encode WriteableBitmap object to a JPEG stream.
                        //Extensions.SaveJpeg(wb, fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
    
                        wb.SaveJpeg(fileStream, wb.PixelWidth, wb.PixelHeight, 0, 85);
                        fileStream.Close();
                    }
                }
            }
    

    Bonus : Le site où j'ai trouvé un exemple pour enregistrer une writeableImage en jpeg avait l'air de proposer deux méthodes : Extensions.SaveJpeg et wb.SaveJpeg, vous me conseillez quoi ? :D

     

    Merci d'avance :)

     

     

    mardi 24 janvier 2012 19:52

Réponses

  • Tu ne laisses même pas l'image se charger ! Quasi tout est asynchrone en windows phone.

     

    Si tu donnes une url à ton bitmap, cela ne veut pas dire que ta bitmapImage va etre chargé avec les données distantes de l'image, au contraire !

    Donc en gros qd tu fait ton SaveJpeg, ton bitmapImage n'a pas encore ses données. Il faut donc que tu télécharges l'image avec un WebClient ou une WebRequest, que tu crées une BitmapImage à partir des données téléchargées, et qu'ensuite tu essaies de la sauvegarder

     

    Pour extensions vs wb, en fait c'est exactement la meme méthode. On appelle cela une méthode d'extension : 

    public static void SaveJpeg(
    	this WriteableBitmap bitmap,
    	Stream targetStream,
    	int targetWidth,
    	int targetHeight,
    	int orientation,
    	int quality
    )

    Le this juste avant writeableBitmap permet d'indiquer que la méthode est appelable en faisant 

     

    <un writeableaBitmap>.SaveJpeg(....)


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    • Proposé comme réponse rudyhuynMVP mercredi 25 janvier 2012 10:42
    • Marqué comme réponse Rbeuque74 mercredi 25 janvier 2012 20:47
    mercredi 25 janvier 2012 10:42
  • D'accord.

    Le soucis c'est que la fonction new BitmapImage() prend en paramètre uniquement un URI, et je sais pas comment récupérer l'URI locale dans le cache du téléphone de l'image téléchargée par le webclient

    EDIT : J'ai trouvé. Pour ceux dans mon cas, il suffit d'utiliser avec le webclient OpenReadAsync à la place de DownloadStringAsync
    • Modifié Rbeuque74 mercredi 25 janvier 2012 20:47 réponse
    • Marqué comme réponse Rbeuque74 mercredi 25 janvier 2012 20:47
    mercredi 25 janvier 2012 17:36

Toutes les réponses

  • Tu ne laisses même pas l'image se charger ! Quasi tout est asynchrone en windows phone.

     

    Si tu donnes une url à ton bitmap, cela ne veut pas dire que ta bitmapImage va etre chargé avec les données distantes de l'image, au contraire !

    Donc en gros qd tu fait ton SaveJpeg, ton bitmapImage n'a pas encore ses données. Il faut donc que tu télécharges l'image avec un WebClient ou une WebRequest, que tu crées une BitmapImage à partir des données téléchargées, et qu'ensuite tu essaies de la sauvegarder

     

    Pour extensions vs wb, en fait c'est exactement la meme méthode. On appelle cela une méthode d'extension : 

    public static void SaveJpeg(
    	this WriteableBitmap bitmap,
    	Stream targetStream,
    	int targetWidth,
    	int targetHeight,
    	int orientation,
    	int quality
    )

    Le this juste avant writeableBitmap permet d'indiquer que la méthode est appelable en faisant 

     

    <un writeableaBitmap>.SaveJpeg(....)


    S'il vous plaît n'oublier pas de marquer la ou les réponses qui aident à résoudre votre problème. Pour que la discussion puisse être marquée comme résolue
    • Proposé comme réponse rudyhuynMVP mercredi 25 janvier 2012 10:42
    • Marqué comme réponse Rbeuque74 mercredi 25 janvier 2012 20:47
    mercredi 25 janvier 2012 10:42
  • D'accord.

    Le soucis c'est que la fonction new BitmapImage() prend en paramètre uniquement un URI, et je sais pas comment récupérer l'URI locale dans le cache du téléphone de l'image téléchargée par le webclient

    EDIT : J'ai trouvé. Pour ceux dans mon cas, il suffit d'utiliser avec le webclient OpenReadAsync à la place de DownloadStringAsync
    • Modifié Rbeuque74 mercredi 25 janvier 2012 20:47 réponse
    • Marqué comme réponse Rbeuque74 mercredi 25 janvier 2012 20:47
    mercredi 25 janvier 2012 17:36