首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Google选择并下载随机图片

从Google选择并下载随机图片
EN

Stack Overflow用户
提问于 2015-01-09 01:44:59
回答 2查看 11.1K关注 0票数 8

有没有什么例子可以让我从google搜索并下载一个随机的图片?使用随机搜索字符串?

我想使用这个图像作为隐写图像,我希望它是一个随机的。

我在Visual Studio2012中使用C#。

EN

回答 2

Stack Overflow用户

发布于 2015-01-09 02:41:46

你可能不想要一个随机的搜索字符串。你可能想要随机的话题。这里有一些代码可以帮你解决这个问题。首先,创建一个主题列表:

代码语言:javascript
复制
private readonly List<string> _topics = new List<string> {"dog", "car", "truck", "cat", "florida"};

当然,您可以随意更改、添加和删除任意数量的主题。接下来,我们将创建一个函数来从Google图像搜索中检索HTML代码,随机选择一个主题进行搜索:

代码语言:javascript
复制
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代码,我们需要解析出位于images_table表下面的img标记,并将图像的URL存储在一个列表中:

代码语言:javascript
复制
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,让它将图像字节下载到一个字节数组中:

代码语言:javascript
复制
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;
}

最后,我们只需要将它们联系在一起:

代码语言:javascript
复制
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);
}

更新

我收到了一些关于这个答案的请求,要求我修改它,使其加载实际的全尺寸图像,而不是缩略图。我已经修改了我的原始代码,以便它现在加载完整大小的图像,而不是缩略图。

首先,像以前一样,创建一个主题列表:

代码语言:javascript
复制
private readonly List<string> _topics = new List<string> { "dog", "car", "truck", "cat", "florida" };

当然,您可以随意更改、添加和删除任意数量的主题。接下来,我们将创建一个函数来从Google图像搜索中检索HTML代码,随机选择一个主题进行搜索。这里的GetHtmlCode()与缩略图版本中的GetHtmlCode()不同,因为我们必须向请求添加一个Accept和一个UserAgent,否则谷歌不会给我们提供完整大小的图片URL:

代码语言:javascript
复制
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代码不同。它仍然从HTML代码中解析出URL:

代码语言:javascript
复制
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,让它将图像字节下载到一个字节数组中。这个函数只有一个与“缩略图”版本不同的微小变化。我们不得不更改ReadBytes()中的数字,因为我们的图像现在会更大:

代码语言:javascript
复制
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;
}

最后,我们只需要像以前一样将它们联系在一起:

代码语言:javascript
复制
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);
}
票数 39
EN

Stack Overflow用户

发布于 2015-09-30 15:07:02

Icemanind的答案对我很有效,尽管我不得不重写Geturls:

代码语言:javascript
复制
    private List<string> GetUrls(string html)
    {
        var urls = new List<string>();

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

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

        return urls;
    }

我还必须找到一个替代Image.FromStream (source)的WPF:

代码语言:javascript
复制
            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;
            }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27846337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档