none
Сохранить картинку

    Вопрос

  • С помощью HttpWebRequest помещаю картинку (.jpg ) из интернета в переменную string .

    Как сохранить эту картинку на компьютере ? (С#)

     

    • Перемещено Tagore Bandlamudi 1 октября 2010 г. 21:50 MSDN Forums consolidation (От:Visual C#)
    10 июня 2010 г. 15:47

Ответы

  • А зачем в строку считывать?. Сразу бы с массивом байтов работали бы лучше. Вобще-то это не так делается. Если url ссылается на изображение, то нужно получить поток GetResponseStream(), из потока получить Image, Image.FromStream(), затем сохранить битмэп в файле Bitmap.Save

    Вот пример, читаю по url картинку, отображаю её в PictureBox и сохраняю в файле на диске

        private void button1_Click(object sender, EventArgs e)
        {
          Func<string, byte[]> downloadFunc = (Url) =>
          {
            byte[] downloadedData = new byte[0];
            try
            {
              WebRequest req = WebRequest.Create(Url);
              WebResponse response = req.GetResponse();
              Stream stream = response.GetResponseStream();
              string responseUrl = response.ResponseUri.ToString();
              byte[] buffer = new byte[1024];
              int dataLength = (int)response.ContentLength;
              MemoryStream memStream = new MemoryStream();
              while (true)
              {
                int bytesRead = stream.Read(buffer, 0, buffer.Length);
                if (bytesRead == 0) break;
                else memStream.Write(buffer, 0, bytesRead);
              }
              downloadedData = memStream.ToArray();
              stream.Close();
              memStream.Close();
            }
            catch (Exception ex)
            {
              return new byte[0];
            }
            return downloadedData;
          };
    
          Func<string, Image> imageFromUrl = (Url) =>
          {
            var imageData = downloadFunc(Url);
            Image img = null;
            try
            {
              var stream = new MemoryStream(imageData);
              img = Image.FromStream(stream);
              stream.Close();
            }
            catch (Exception) { }
            return img;
          };
    
    
          var image = imageFromUrl("http://public.blu.livefilestore.com/y1p7fGDoHQEvnjGMfrQrJcI5d3Q2y6ACzxVBNuN4ysq1VejyZyP5vNA4Kdy2Elqe-wKbENxUyErOn9s5Osh4ld7Qw/ScreenShot156.jpg?psid=1");
          pictureBox1.Image = image;
          Bitmap b = new Bitmap(image);
          b.Save(@"c:\users\oleg\test.jpg");
        }
    • Помечено в качестве ответа geforse 11 июня 2010 г. 10:37
    • Снята пометка об ответе geforse 11 июня 2010 г. 13:24
    • Помечено в качестве ответа geforse 11 июня 2010 г. 13:25
    11 июня 2010 г. 7:17

Все ответы

  • using System.IO;

    File.WriteAllText(String Name, String Content);

    File.WriteAllText(String Name, String Content, Encoding encoding);

    Подробнее http://msdn.microsoft.com/ru-ru/library/system.io.file.writealltext.aspx

    10 июня 2010 г. 21:15
  • Я уже пробовал так. Создаётся файл .jpg (не пустой), но как картинка не распознаётся Windows .

    Средство просмотра фотографий windows не может открыть это изображение

    11 июня 2010 г. 4:22
  • А зачем в строку считывать?. Сразу бы с массивом байтов работали бы лучше. Вобще-то это не так делается. Если url ссылается на изображение, то нужно получить поток GetResponseStream(), из потока получить Image, Image.FromStream(), затем сохранить битмэп в файле Bitmap.Save

    Вот пример, читаю по url картинку, отображаю её в PictureBox и сохраняю в файле на диске

        private void button1_Click(object sender, EventArgs e)
        {
          Func<string, byte[]> downloadFunc = (Url) =>
          {
            byte[] downloadedData = new byte[0];
            try
            {
              WebRequest req = WebRequest.Create(Url);
              WebResponse response = req.GetResponse();
              Stream stream = response.GetResponseStream();
              string responseUrl = response.ResponseUri.ToString();
              byte[] buffer = new byte[1024];
              int dataLength = (int)response.ContentLength;
              MemoryStream memStream = new MemoryStream();
              while (true)
              {
                int bytesRead = stream.Read(buffer, 0, buffer.Length);
                if (bytesRead == 0) break;
                else memStream.Write(buffer, 0, bytesRead);
              }
              downloadedData = memStream.ToArray();
              stream.Close();
              memStream.Close();
            }
            catch (Exception ex)
            {
              return new byte[0];
            }
            return downloadedData;
          };
    
          Func<string, Image> imageFromUrl = (Url) =>
          {
            var imageData = downloadFunc(Url);
            Image img = null;
            try
            {
              var stream = new MemoryStream(imageData);
              img = Image.FromStream(stream);
              stream.Close();
            }
            catch (Exception) { }
            return img;
          };
    
    
          var image = imageFromUrl("http://public.blu.livefilestore.com/y1p7fGDoHQEvnjGMfrQrJcI5d3Q2y6ACzxVBNuN4ysq1VejyZyP5vNA4Kdy2Elqe-wKbENxUyErOn9s5Osh4ld7Qw/ScreenShot156.jpg?psid=1");
          pictureBox1.Image = image;
          Bitmap b = new Bitmap(image);
          b.Save(@"c:\users\oleg\test.jpg");
        }
    • Помечено в качестве ответа geforse 11 июня 2010 г. 10:37
    • Снята пометка об ответе geforse 11 июня 2010 г. 13:24
    • Помечено в качестве ответа geforse 11 июня 2010 г. 13:25
    11 июня 2010 г. 7:17
  • Зачем столько кода писать?

    WebClient web = new WebClient();
    web.DownloadFile("url", "local_file_name");

    pictureBox1.Image = Image.FromFile("local_file_name");

    11 июня 2010 г. 12:21
  • Вопрос был не про WebClient, а про WebRequest.

    Предполагал, что человек работает с потоками, а не с готовым клиентом.

    11 июня 2010 г. 12:27
  • Насколько я помню, WebClient является обверткой для WebRequset / WebResponse (so ).

    Если задача ограничивается скачиванием файла, то, имхо, использовать WebClient лучше.

    11 июня 2010 г. 13:47
  • Я не знаю чем ограничивается задача.

    Если задача совсем ограничена, то можно сохранить имг через браузер - вобще ничего писать не нужно:)

    11 июня 2010 г. 14:44