2016-07-23 29 views
0

我创建了一个表格应用提取的图像,我已经搜查了许多帖子,到现在为止我能下载到的MemoryStream(字节数组)。 我无法保存字节数组到文件系统,并检查图像尺寸....C#下载提取的图像

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    public List<string> FetchImages(string Url) 
    { 
     List<string> imageList = new List<string>(); 


     if (!Url.StartsWith("http://") && !Url.StartsWith("https://")) 
      Url = "http://" + Url; 

     string responseUrl = string.Empty; 
     string htmlData = ASCIIEncoding.ASCII.GetString(DownloadData(Url, out responseUrl)); 

     if (responseUrl != string.Empty) 
      Url = responseUrl; 

     if (htmlData != string.Empty) 
     { 
      string imageHtmlCode = "<img"; 
      string imageSrcCode = @"src="""; 

      int index = htmlData.IndexOf(imageHtmlCode); 
      while (index != -1) 
      { 

       htmlData = htmlData.Substring(index); 


       int brackedEnd = htmlData.IndexOf('>'); //make sure data will be inside img tag 
       int start = htmlData.IndexOf(imageSrcCode) + imageSrcCode.Length; 
       int end = htmlData.IndexOf('"', start + 1); 

        if (end > start && start < brackedEnd) 
       { 
        string loc = htmlData.Substring(start, end - start); 

         imageList.Add(loc); 
       } 

        if (imageHtmlCode.Length < htmlData.Length) 
        index = htmlData.IndexOf(imageHtmlCode, imageHtmlCode.Length); 
       else 
        index = -1; 
      } 

       for (int i = 0; i < imageList.Count; i++) 
      { 
       string img = imageList[i]; 

       string baseUrl = GetBaseURL(Url); 

       if ((!img.StartsWith("http://") && !img.StartsWith("https://")) 
        && baseUrl != string.Empty) 
        img = baseUrl + "/" + img.TrimStart('/'); 

       imageList[i] = img; 
      } 
     } 

     return imageList; 
    } 


    private byte[] DownloadData(string Url) 
    { 
     string empty = string.Empty; 
     return DownloadData(Url, out empty); 
    } 

    private byte[] DownloadData(string Url, out string responseUrl) 
    { 
     byte[] downloadedData = new byte[0]; 
     try 
     { 
       WebRequest req = WebRequest.Create(Url); 
      WebResponse response = req.GetResponse(); 
      Stream stream = response.GetResponseStream(); 

      responseUrl = response.ResponseUri.ToString(); 

       byte[] buffer = new byte[1024]; 


      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) 
     { 
      responseUrl = string.Empty; 
      return new byte[0]; 
     } 

     return downloadedData; 
    } 

    private Image ImageFromURL(string Url) 
    { 
     byte[] imageData = DownloadData(Url); 
     Image img = null; 

     try 
     { 
      MemoryStream stream = new MemoryStream(imageData); 
      img = Image.FromStream(stream); 
      stream.Close(); 
     } 
     catch (Exception) 
     { 
     } 

     return img; 
    } 

    private string GetBaseURL(string Url) 
    { 
     int inx = Url.IndexOf("://") + "://".Length; 
     int end = Url.IndexOf('/', inx); 

     string baseUrl = string.Empty; 
     if (end != -1) 
      return Url.Substring(0, end); 
     else 
      return string.Empty; 
    } 

    private void btnGetImages_Click(object sender, EventArgs e) 
    {    
     this.Cursor = Cursors.WaitCursor; 

     listImages.Items.Clear(); 

     foreach (string image in FetchImages(txtURL.Text)) 
     { 
      listImages.Items.Add(image); 
     } 

     this.Cursor = Cursors.Default; 
    } 

    private void btnView_Click(object sender, EventArgs e) 
    { 
     if (listImages.SelectedIndex != -1) 
      picImage.Image = ImageFromURL(listImages.SelectedItem.ToString()); 
    } 

    private void btnSave_Click(object sender, EventArgs e) 
    { 

    } 

    private void btnDownload_Click(object sender, EventArgs e) 
    { 
     DownloadData(txtURL.Text); 
    } 

..我试图将memroy流保存到硬盘驱动器,但仍然没有得到确切的代码,

我觉得如果你想保存byte []数组到这个代码需要一些额外的变化

MemoryStream memStream = new MemoryStream(); 
       while (true) 
       { 
        //Try to read the data 
        int bytesRead = stream.Read(buffer, 0, buffer.Length); 

        if (bytesRead == 0) 
        { 
         break; 
        } 
        else 
        { 
         //Write the downloaded data 
         memStream.Write(buffer, 0, bytesRead); 
        } 
       } 

任何帮助将不胜感激

回答

1

文件,

语法:File.WriteAllBytes(string path, byte[] bytes)

如:File.WriteAllBytes("Foo.txt", arrBytes); // Requires System.IO

如果你想用字节转换回图像并保存到驱动器参考更多信息http://msdn.microsoft.com/en-us/library/system.io.file.writeallbytes.aspx

此链接。例如:

byte[] bitmap = YourImage(); 

using(Image image = Image.FromStream(new MemoryStream(bitmap))) 
{ 
    image.Save("image.jpg", ImageFormat.Jpeg); 
} 
+0

什么是“YourImage()”? –

+0

考虑一下你提供数据进行转换的方法。 – Thennarasan

+0

错误出现“附加信息:参数无效”。 –