Stream Icone

Signaler
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009
-
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
-
Bonjour,

J'essaie de récupérer le favicon d'un site pour le WebBrowser, mais j'ai un gros pb. En gros, voila un code qui fonctionne :
                WebResponse webResponse = webRequest.GetResponse();
                if (webResponse.ContentLength > 0)
                    using (Stream stream = webResponse.GetResponseStream())
                    {
                        FileStream fs = new FileStream(@"D:\Users\Sebastien\Documents\icon.ico", FileMode.OpenOrCreate);
                        byte[] b = new byte[1024];
                        int read = 0;
                        while ((read = stream.Read(b, 0, b.Length)) > 0)
                            fs.Write(b,0,b.Length);
                        fs.Close();
                        this._favIcon = new Icon(@"D:\Users\Sebastien\Documents\icon.ico");
                    }
                  webResponse.Close();

Mais j'aimerais que ca fonctionne sans fichier, soit poser le Stream dans un Image.FromStream(stream), soit directement dans new Icon(stream);
Mais à ce moment la, ca ne marche plus pour new Icon(stream); et ca marche avec Image.FromStream sur google, microsoft... mais pas sur Codes-Sources, developpez.com....

A noter, pour les sites ou cela marche, IE indique l'encodage des pages en UTF-8, les autres, c'est en ISO... je ne sais pas si ca peux correspondre ou si c'est le hasard.

Merci de votre aide







<hr />




I love .net

19 réponses

Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
A la place de ton FileStream passe par un MemoryStream... ca t'évite de sauvegarder un fichier temporaire sur le disque.

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

J'ai fais et ca ne marche pas...

<hr />I love .net
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
C'est quoi ton code avec la MemoryStream ?

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

En faite, je fais avant avec le MemoryStream, j'ai essayé avec le FileStream seulement pour voir ce que ca me donnerais dans un fichier comme apercu avec un autre logiciel de Windows...

<hr />I love .net
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

                    using (Stream stream = webResponse.GetResponseStream())
                    {
                        using (MemoryStream mStream = new MemoryStream())
                        {
                            byte[] buffer = new byte[1024];
                            while (stream.Read(buffer, 0, buffer.Length) > 0)
                                mStream.Write(buffer, 0, buffer.Length);
                            using (Bitmap bmp = new Bitmap(mStream))
                            {
                                this._favIcon = Icon.FromHandle(bmp.GetHicon());
                            }
                        }
                    }

<hr />I love .net
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
et en faisant tout simplement :

WebResponse webResponse = webRequest.GetResponse();
if (webResponse.ContentLength > 0) {
   using (MemoryStream stream = webResponse.GetResponseStream()) {
      this._favIcon = new Icon(stream);
   }
}
webResponse.Close();

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
47
Pour pinailler, je dirais qu'on peut aussi mettre un using pour le webResponse, tant qu'à faire...

<hr />
-My Blog-
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Non, ca ne marche pas du tout ce code : Le MemoryStream demande une conversion explicite, et même avec ca ne marche pas du tout. De plus, la conversion directe du Stream en Icone ne marche pas du tout non plus.
Ce qui marche, mais pas sur des sites comme codes-sources ou developpez.com et qui est bcp plus simple, c'est ca :

WebResponse webResponse = webRequest.GetResponse();
if (webResponse.ContentLength > 0) {
   using (Stream stream = webResponse.GetResponseStream()) {
        using (Bitmap bmp = new Bitmap(stream))
            this._favIcon = Icon.FromHandle(bmp.GetHicon());
   }
}
webResponse.Close();

La, ca marche avec Google ou Microsoft, mais pas ici. Ca ne marche plus si je ne passe pas par un Bitmap

<hr />I love .net
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
Bizarre... quelle-est l'erreur que tu reçois quand tu utilises un bitmap ?

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

C'est une erreur de GDI... et sans try catch, il zappe le reste du code de la méthode, ca m'est arrivé d'autre fois avec GDI. Avec try catch, je recoit "Le paramètre n'est pas valide" ... c'est tout.
Interception de System.ArgumentException
  Message="Le paramètre n'est pas valide."
  Source="System.Drawing"
  StackTrace:
       à System.Drawing.Bitmap..ctor(Stream stream)
       à ExtendWebBrowser.OnDocumentCompleted(WebBrowserDocumentCompletedEventArgs e) dans ...\ExtendWebBrowser.cs:ligne 79

Ca bloque au moment de la transformation du stream en image.
J'ai aussi essayé ca : Image img = Image.FromStream(stream)... meme chose, ca plante ici.

<hr />I love .net
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
ok... je pense que la stream n'est pas une bitmap valable.

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Mais alors pourquoi quand j'enregistre dans un fichier l'icone puis que je retourne le cherche directement avec le constructeur de Icone ca marche.... le filestream fait quelque chose de spécial? c'est la que je comprends pas le problème.

<hr />I love .net
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
47
Est-ce que ce n'est pas parce que le Stream n'est pas seekable ou readable par hasard?

<hr />
-My Blog-
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Mais le fait de le mettre dans un MemoryStream devrait résoudre cet éventuelle pb. Ca devrais faire la meme chose qu'avec un filestream...
{
   Je sais que qu'il lève à 95% de fois une exception sur Lenght et Position.
   Par un point d'arret, il m'est arrivé une fois de le voir CanRead = false.
   Il est toujours CanSeek = false par compte.
}  (meme la ou le code marche)

Mais une fois dans le MemoryStream, il readable, seekable, writable.... et pas vide biensur.

<hr />I love .net
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Oui, j'ai déjà vu, mais à par passer par une gestion d'un proxy, certains de mes tests ressemblaient exactement à ca. Je suis déjà tombé sur cette source sans jamais la télécharger, et après test, le résultat est le même...

<hr />I love .net
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
47
Ok, bon je ne vois pas le problème, mais j'ai rapidement essayé un truc:

stringstr1 =
"http://www.codes-sources.com/favicon.ico";

stringstr2 = "http://www.microsoft.com/favicon.ico";

this.pictureBox1.LoadAsync(str1/2);

Ca marche dans un cas, et pas dans l'autres...
Tu peux creuser de ce côté là :)

<hr />
-My Blog-
Messages postés
219
Date d'inscription
jeudi 6 juillet 2006
Statut
Membre
Dernière intervention
7 septembre 2009

Ben chez, ca marche chez MS, mais pas ici, comme pour mon code... Mais merci d'avoir pensé à ca, ca viens de m'éviter de tester le GetResponse assynchrone, qui apparement ne donnerait pas plus de résultat.

<hr />I love .net
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
la seule différence que je vois entre ces images... c'est la taille : 32x32 pour MS et 48x48 pour CS.

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]