2015-01-08 2 views
4

Есть ли какой-нибудь пример того, как я могу искать и загружать случайное изображение из Google? Использование строки случайного поиска?Выберите и скачайте произвольное изображение из Google

Я хочу использовать это изображение в качестве изображения стеганографии, и хочу, чтобы это было случайным.

Я использую C# с Visual Studio 2012.

+1

Действительно ли вы хотите, чтобы строка случайного поиска? например HE8IHN96HV3? Это скорее всего не вернет совпадений с изображениями Google. Вместо этого вы можете выбрать случайное слово из словаря, найти его, а затем выбрать случайное изображение из всех результатов. Чтобы на самом деле добиться этого на C#, ознакомьтесь с документацией API поиска Google по адресу https://googledotnet.codeplex.com/ – Karnivaurus

+0

Спасибо Karnivaurus. Я проверю. –

+0

Я мог бы просто увидеть, что, воспитывая некоторые ... ummm ... «интересные» результаты, я бы не включил его в бизнес-приложение. :-P – Ads

ответ

26

Вы, вероятно, не хотите случайную строку поиска. Вероятно, вам нужны случайные темы. Вот какой код вам поможет. Во-первых, создать список тем:

private readonly List<string> _topics = new List<string> {"dog", "car", "truck", "cat", "florida"}; 

Конечно, вы можете изменять, добавлять и удалять столько тем, как вы хотите. Далее, мы создадим функцию, чтобы получить HTML-код из поиска изображений Google, случайным образом выбирает одну из наших тем, чтобы найти:

private string GetHtmlCode() 
{ 
    var rnd = new Random(); 

    int topic = rnd.Next(0, _topics.Count - 1); 

    string url = "https://www.google.com/search?q=" + _topics[topic] + "&tbm=isch"; 
    string data = ""; 

    var request = (HttpWebRequest)WebRequest.Create(url); 
    var response = (HttpWebResponse)request.GetResponse(); 

    using (Stream dataStream = response.GetResponseStream()) 
    { 
     if (dataStream == null) 
      return ""; 
     using (var sr = new StreamReader(dataStream)) 
     { 
      data = sr.ReadToEnd(); 
     } 
    } 
    return data; 
} 

После того, как у нас есть HTML-код, нам нужно разобрать на img тегов расположенный под images_table стол и хранить URL, изображений в списке:

private List<string> GetUrls(string html) 
{ 
    var urls = new List<string>(); 
    int ndx = html.IndexOf("class=\"images_table\"", StringComparison.Ordinal); 
    ndx = html.IndexOf("<img", ndx, StringComparison.Ordinal); 

    while (ndx >= 0) 
    { 
     ndx = html.IndexOf("src=\"", ndx, StringComparison.Ordinal); 
     ndx = ndx + 5; 
     int ndx2 = html.IndexOf("\"", ndx, StringComparison.Ordinal); 
     string url = html.Substring(ndx, ndx2 - ndx); 
     urls.Add(url); 
     ndx = html.IndexOf("<img", ndx, StringComparison.Ordinal); 
    } 
    return urls; 
} 

Наша последняя функция нам нужно это принять URL и это загрузить байты изображения в массив байтов:

private byte[] GetImage(string url) 
{ 
    var request = (HttpWebRequest)WebRequest.Create(url); 
    var response = (HttpWebResponse)request.GetResponse(); 

    using (Stream dataStream = response.GetResponseStream()) 
    { 
     if (dataStream == null) 
      return null; 
     using (var sr = new BinaryReader(dataStream)) 
     { 
      byte[] bytes = sr.ReadBytes(100000); 

      return bytes; 
     } 
    } 

    return null; 
} 

Наконец, нам просто нужно связать все это вместе:

string html = GetHtmlCode(); 
List<string> urls = GetUrls(html); 
var rnd = new Random(); 

int randomUrl = rnd.Next(0, urls.Count - 1); 

string luckyUrl = urls[randomUrl]; 

byte[] image = GetImage(luckyUrl); 
using (var ms = new MemoryStream(image)) 
{ 
    pictureBox1.Image = Image.FromStream(ms); 
} 

UPDATE

Я получил несколько запросов по поводу этого ответа с просьбой, что я могу изменить его, чтобы он загружает фактическое полноразмерное изображение, а не миниатюра. Я изменил свой исходный код, чтобы теперь загружать изображения полного размера вместо миниатюр.

Во-первых, как и раньше, создать список тем:

private readonly List<string> _topics = new List<string> { "dog", "car", "truck", "cat", "florida" }; 

Конечно, вы вольны изменять, добавлять и удалять столько тем, как вы хотите. Затем мы создадим функцию для извлечения кода HTML из поиска изображений Google, случайно выбрав одну из наших тем для поиска. GetHtmlCode() здесь отличается от GetHtmlCode() в версии эскиза в том, что мы должны добавить Accept и UserAgent на запрос, либо Google не даст нам полные URL, размер изображения:

private string GetHtmlCode() 
{ 
    var rnd = new Random(); 

    int topic = rnd.Next(0, _topics.Count - 1); 

    string url = "https://www.google.com/search?q=" + _topics[topic] + "&tbm=isch"; 
    string data = ""; 

    var request = (HttpWebRequest)WebRequest.Create(url); 
    request.Accept = "text/html, application/xhtml+xml, */*"; 
    request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"; 

    var response = (HttpWebResponse)request.GetResponse(); 

    using (Stream dataStream = response.GetResponseStream()) 
    { 
     if (dataStream == null) 
      return ""; 
     using (var sr = new StreamReader(dataStream)) 
     { 
      data = sr.ReadToEnd(); 
     } 
    } 
    return data; 
} 

Метод GetUrls() был также переписан, потому что HTML-код, который мы получаем обратно, отличается от кода HTML, который мы вернули в нашей версии «thumbnail». Он по-прежнему разбирает из URL-адреса из HTML-кода:

private List<string> GetUrls(string html) 
{ 
    var urls = new List<string>(); 

    int ndx = html.IndexOf("\"ou\"", StringComparison.Ordinal); 

    while (ndx >= 0) 
    { 
     ndx = html.IndexOf("\"", ndx + 4, StringComparison.Ordinal); 
     ndx++; 
     int ndx2 = html.IndexOf("\"", ndx, StringComparison.Ordinal); 
     string url = html.Substring(ndx, ndx2 - ndx); 
     urls.Add(url); 
     ndx = html.IndexOf("\"ou\"", ndx2, StringComparison.Ordinal); 
    } 
    return urls; 
} 

Наша последняя функция нам нужно, чтобы взять URL и это загрузить байты изображения в массив байтов. В этой функции есть только одно незначительное изменение, отличное от версии «thumbnail».Нам пришлось изменить число в ReadBytes(), так как наши изображения будет больше прямо сейчас:

private byte[] GetImage(string url) 
{ 
    var request = (HttpWebRequest)WebRequest.Create(url); 
    var response = (HttpWebResponse)request.GetResponse(); 

    using (Stream dataStream = response.GetResponseStream()) 
    { 
     if (dataStream == null) 
      return null; 
     using (var sr = new BinaryReader(dataStream)) 
     { 
      byte[] bytes = sr.ReadBytes(100000000); 

      return bytes; 
     } 
    } 

    return null; 
} 

Наконец, нам просто нужно связать все это вместе, как и раньше:

string html = GetHtmlCode(); 
List<string> urls = GetUrls(html); 
var rnd = new Random(); 

int randomUrl = rnd.Next(0, urls.Count - 1); 

string luckyUrl = urls[randomUrl]; 

byte[] image = GetImage(luckyUrl); 
using (var ms = new MemoryStream(image)) 
{ 
    pictureBox1.Image = Image.FromStream(ms); 
} 
+4

Почему нет аппотов? Этот ответ приложил определенные усилия. – mafu

+2

@mafu - Я согласен! Ха-ха – Icemanind

+1

Это довольно круто. Было бы лучше, если бы вы могли загрузить изображение полного качества, которое вы получаете, когда вы нажимаете миниатюру. – Julien

1

ответ Icemanind в основном работал для меня , хотя мне пришлось переписать Geturls:

private List<string> GetUrls(string html) 
    { 
     var urls = new List<string>(); 

     string search = @"imgurl=(.*?)&"; 
     MatchCollection matches = Regex.Matches(html, search); 

     foreach (Match match in matches) 
     { 
      urls.Add(match.Groups[1].Value); 
     } 

     return urls; 
    } 

Я также должен был найти альтернативу WPF для Image.FromStream (source):

  byte[] image = GetImage(luckyUrl); 

      using (var stream = new MemoryStream(image)) 
      { 
       var bitmap = new BitmapImage(); 
       bitmap.BeginInit(); 
       bitmap.StreamSource = stream; 
       bitmap.CacheOption = BitmapCacheOption.OnLoad; 
       bitmap.EndInit(); 
       bitmap.Freeze(); 

       this.img.Source = bitmap; 
      } 
Смежные вопросы