【问题标题】:Using C#, how can I detect if an Image URL returns something different from a default image?使用 C#,如何检测图像 URL 是否返回与默认图像不同的内容?
【发布时间】:2015-07-18 12:02:46
【问题描述】:

我有一些代码正在使用the solution from this question 来验证某个图片网址是否存在。

所以我的代码如下所示:

 private bool PictureExists(string id)
    {
        string url = "https://www.example.com/profile.do?userid=" + id;
        var request = (HttpWebRequest)HttpWebRequest.Create(url);
        request.Method = "HEAD";

        bool exists;
        try
        {
            request.GetResponse();
            exists = true;
        }
        catch
        {
            exists = false;
        }
        return exists;
    }
}

如果图片不存在,此函数将返回 false 并且工作正常。

现在的问题是该函数开始返回 true,我发现根本原因是如果我要搜索的内容不存在,他们已更改后端以返回默认图像。

所以我的新要求是如何检查返回的图像是否不是默认图像(这样我就可以复制之前的验证)?

【问题讨论】:

  • Head 通常会返回大小 - 检查它可能就足够了(如果您可以容忍的话,可能会出现错误结果)。
  • 检查头部大小的正确方法是什么?
  • 您可以存储默认图像的哈希值并计算下载图像的哈希值,如果它们匹配则它是默认图像。如果有多个默认图像,则需要存储每个图像的哈希值并进行比较。
  • @leora 内容长度标头 - stackoverflow.com/questions/3854842/… 。因此,如果网站总是返回相同的“missing-picture.png”,它将具有 HEAD 可能返回的相同大小...

标签: c# image httpwebrequest


【解决方案1】:

可能不是最好的解决方案,但我的第一个想法是将默认图像转换为字节数组变量,然后下载您要检查的图像,并将其转换为字节数组。然后你可以比较它们:

要比较的代码(仅来自 .NET 3.5!):

static public bool ByteArrayCompare(byte[] a1, byte[] a2) 
{
    return a1.SequenceEqual(a2);
}

将 Image 转换为 byte[] 的代码:

static public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
    MemoryStream ms = new MemoryStream();
    imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
    return ms.ToArray();
}

希望对你有帮助,对英语不好表示抱歉。

【讨论】:

  • 或者base64字符串比较可能更好,我不太清楚,我只是把想法扔给自己:)
  • 我会将其与@Alexei Levenkov 对该问题的评论结合起来:首先检查 HEAD 大小,然后仅在需要进一步检查时才下载图像。
  • 绝对聪明的建议,我也会结合它。 :)
  • 您可以存储默认图像的哈希值并计算下载图像的哈希值,如果它们匹配则它是默认图像。如果有多个默认图像,则需要存储每个图像的哈希值并进行比较。
  • @MichaelMurphy - 你能举个例子说明你会怎么做吗
猜你喜欢
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2015-03-17
相关资源
最近更新 更多