c# - 从 Google 选择并下载随机图片

标签 c# image steganography

有没有我可以从谷歌搜索和下载随机图像的例子?使用随机搜索字符串?

我想将此图像用作隐写术图像,并且我希望它是随机图像。

我在 Visual Studio 2012 中使用 C#。

最佳答案

您可能不想要随机搜索字符串。您可能想要随机主题。这是一些可以帮助您的代码。首先,创建一个主题列表:

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

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

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 存储在列表中:

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);
}

更新

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

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

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

当然,您可以随意更改、添加和删除任意数量的主题。接下来我们将创建一个函数来从 Google 图像搜索中检索 HTML 代码,随机选择我们的主题之一进行搜索。这里的GetHtmlCode()和缩略图版的GetHtmlCode()不同,我们必须添加一个Accept和一个UserAgent 添加到请求中,否则 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);
    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:

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() 中的数字,因为我们的图像现在会更大:

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);
}

关于c# - 从 Google 选择并下载随机图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27846337/

相关文章:

JavaScript 隐写术 : Hiding an image inside of an image

c# - 生成一个带一位小数点的随机 double

c# - 将 YamlDotNet 插件中的 YamlStream 保存到文本文件

c# - .Net SDK 或 OpenSRS API 示例?

HTML 背景图像链接

android - 将图像添加到 jar 库

c# - 从 phonegap 应用程序的 MainPage.xaml.cs 切换 html 页面

django - 自定义ImageField.image.url

Linux - 修改文件修改/访问/更改时间

python - 使用 python 将数据嵌入到二进制图像中