检查有效图像

时间:2009-02-17 02:23:08

标签: c++ image

我正在编写一个从网上下载信息的程序,其中一部分是图像。

目前我遇到了问题,因为下载图像的代码与显示它们的代码(在mvc下)不同。如果发布404或图像下载以某种方式失败,显示代码会弹出一条消息,我想避免它。

有没有简单的方法来检查图像是否有效?我只关心jpg,gif和png。

注意:我不关心阅读图像数据,只是为了检查它是否是有效的图像格式。

4 个答案:

答案 0 :(得分:6)

您想检查下载是否成功?或者您想检查下载的内容实际上是图像吗?

在前一种情况下,检查的唯一方法是尝试访问它并查看您获得的HTTP响应代码类型。您可以发送HTTP HEAD请求以获取响应代码而无需实际下载图像,但如果您只是继续下载图像(如果成功),则发送单独的{{1}请求似乎浪费时间(和带宽)。

或者,如果您确实想要检查您下载的是有效的图像文件,则必须阅读整个文件以检查其是否损坏。但是,如果您只想检查文件扩展名是否准确,那么检查文件的前几个字节应该足够了。所有GIF图像均以ASCII文本HEADGIF87开头,具体取决于使用的GIF规范。 PNG图像以ASCII文本GIF89开头,而JPEG图像有一些幻数,根据我查看的JPEG,它看起来是PNG。 (你应该做一些研究并检查一下,试试维基百科的链接)但请记住,要获得图像的前几个字节,你需要发送一个可以返回404的HTTP请求(并且在那里如果您没有要检查的图像,请执行。)

答案 1 :(得分:3)

谢谢你的回答。我已准备好下载文件,所以我只是检查魔术数字作为我使用的前端(wxWidgets)所有准备好的图像库,我想要一些非常轻的。

uint8 UTIL_isValidImage(const unsigned char h[5])
{

    //GIF8
    if (h[0] == 71 && h[1] == 73 && h[2] == 70 && h[3] == 56)
        return IMAGE_GIF;

    //89 PNG
    if (h[0] == 137 && h[1] == 80 && h[2] == 78 && h[3] == 71)
        return IMAGE_PNG;

    //FFD8
    if (h[0] == 255 && h[1] == 216)
        return IMAGE_JPG;

    return IMAGE_VOID;
}

答案 2 :(得分:1)

如果您真的想知道图像文件是否有效,您实际上必须对其进行解码(尽管您不需要存储这些位)。这是因为文件大小可能不正确或可能已损坏。

如果您使用HTTP库进行下载,则应该能够检查标头并知道您收到404错误而不是真正的有效负载。查看您正在使用的库的文档。

如果你要找回一个文件并想要查看它是否是一个没有完全解码的图像,那么你至少需要检查标题的有效性。 libpnglibjpeg分别提供对png和jpeg文件的低级访问。您还可以查看更高级别的库,如ImageMagick,Microsoft的MFC或任何最适合您平台的库。

答案 3 :(得分:0)

当您通过HTTP GET资源时,必须使用Content-Type标头来确定如何处理内容。如果您已将其下载到本地文件,则真实Web浏览器所依赖的信息已丢失。在许多情况下,该网址将与内容类型相匹配(例如,http://example.com/image.png已提供为Content-Type: image/png)。但是,你不能依赖它。