Jump to content
Xtreme .Net Talk

Recommended Posts

Posted

I'm having a little problem saving a image to disk. I get the image from a url, and want to save that to disk.

 

So i just do a HttpWebRequest to the image url, get the stream and convert it to an image and save to disk. This code here is working for jpg's but its does not work with GIF. also there are somethings that would like to change. the code is this:

 

public  static String HttpRequest(String serverImgURL, String physicalPath, String extention)
       {
           String siteImgURL;
           HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(serverImgURL);

           HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse();

           Encoding enc = Encoding.GetEncoding("ISO-8859-1");            

           StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc);

           String lcHtml = loResponseStream.ReadToEnd();

           loWebResponse.Close();
           loResponseStream.Close();

           String imageName = serverImgURL.Substring(serverImgURL.LastIndexOf("/") + 1, serverImgURL.Length - serverImgURL.LastIndexOf("/") - 1);
           siteImgURL = ConvertToImage(lcHtml, physicalPath, imageName, extention);

           return siteImgURL;
       }

private static String ConvertToImage(String stringImage, String physicalPath, String imageName, String extention)
       {
           string imageurl = string.Empty;

           if (stringImage.Length > 0)
           {
               Byte[] bitmapData;
               bitmapData = ToByteArray(stringImage);
               MemoryStream streamBitmap = new MemoryStream(bitmapData);
               Bitmap bitImage = new Bitmap(Image.FromStream(streamBitmap));

               String fotoPath;
               fotoPath = physicalPath + "\\" + imageName;

               if (extention.ToLower() == "jpg")
                   bitImage.Save(fotoPath, ImageFormat.Jpeg);
               else
                   bitImage.Save(fotoPath, ImageFormat.Gif);
           }

           return imageurl;
       }

public static Byte[] ToByteArray(String StringToConvert)
       {
           Encoding encoding = Encoding.GetEncoding("ISO-8859-1");
           Byte[] ByteArray = encoding.GetBytes(StringToConvert);

           return ByteArray;
       }

 

 

my problem is that this code does actually work for JPG. But when i try to get a GIF i get an exception when tring to save to disk. Any ideia why?

 

bitImage.Save(fotoPath, ImageFormat.Gif);
{"A generic error occurred in GDI+."}

 

Exception:

System.Runtime.InteropServices.ExternalException was unhandled by user code
 Message="A generic error occurred in GDI+."
 Source="System.Drawing"
 ErrorCode=-2147467259

Posted

i need to use the imagem and show it on a webpage after. Thats why i dont just store the bytes. I cant understand this error and debugging it seems almost impossible.

 

any help is welcome.

 

thank you

  • Administrators
Posted

I haven't checked but there is a chance that creating an image and then saving it could result in the image being compressed again - which in the case of a jpeg will reduce the quality, saving the raw bytes locally and then either creating an image from that or the original byte stream would prevent this.

 

It could also be down to restrictions of the gif format - depending on the original image you could be attempting something that just isn't supported.

Posting Guidelines FAQ Post Formatting

 

Intellectuals solve problems; geniuses prevent them.

-- Albert Einstein

Posted

well i've been searching the web and came up with this

 

public  static String Cache(String serverImgURL, String physicalPath, String extention)
       {
           String siteImgURL;

           HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(serverImgURL);
           HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse();

           MemoryStream memStream = new MemoryStream();

           using (Stream responseStream = loWebResponse.GetResponseStream())
           {
               byte[] buffer = new byte[0x1000];
               int bytes;
               while ((bytes = responseStream.Read(buffer, 0, buffer.Length)) > 0)
               {
                   memStream.Write(buffer, 0, bytes);
               }
           }

           loWebResponse.Close();

           String imageName = serverImgURL.Substring(serverImgURL.LastIndexOf("/") + 1, serverImgURL.Length - serverImgURL.LastIndexOf("/") - 1);
           siteImgURL = ToImage(memStream, physicalPath, imageName, extention);

           return siteImgURL;
       }


private static String ToImage(MemoryStream streamBitmap, String physicalPath, String imageName, String extention)
       {
           string imageurl = string.Empty;

           Bitmap bitImage = (Bitmap) Bitmap.FromStream(streamBitmap);

           String fotoPath;
           fotoPath = physicalPath + "\\" + imageName;

           if (extention.ToLower() == "jpg")
               bitImage.Save(fotoPath, ImageFormat.Jpeg);
           else
               bitImage.Save(fotoPath, ImageFormat.Gif);


           return imageurl;
       }

 

I had some mesure of success with this aproach. I tried Gif's and jpg's from diferente websites and was able to save them to disk. From the look of it i was able to keep the quality of the image.

 

But (there's always a but ;)) when i try the same from the server i'm using to store the images (i dont have any control on how they are stored) the error on the gif's still exist.

 

I'm not very sure about this code. Is there anyway to optimize it?

 

MemoryStream memStream = new MemoryStream(); 

           using (Stream responseStream = loWebResponse.GetResponseStream()) 
           { 
               byte[] buffer = new byte[0x1000]; 
               int bytes; 
               while ((bytes = responseStream.Read(buffer, 0, buffer.Length)) > 0) 
               { 
                   memStream.Write(buffer, 0, bytes); 
               } 
           } 

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...