2009-02-17 44 views
1

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

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

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

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

回答

5

是否要检查下载是否成功?或者你想检查下载的是什么,实际上是一个图像?

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

或者,如果您确实想检查您下载的内容是否是有效的映像文件,则必须读取整个文件以检查是否存在损坏。但是,如果您只想检查文件扩展名是否准确,那么检查文件的前几个字节就足够了。取决于使用哪种GIF规范,所有GIF图像都以ASCII文本GIF87GIF89开头。 PNG图像以ASCII文本PNG开头,并且JPEG图像具有一些幻数,根据我所看到的JPEG,它似乎是0xd8ffe0ff。 (你应该做一些研究和检查,试试维基百科的链接)但请记住,即使图像的前几个字节,你需要发送一个HTTP请求,可以返回一个404(并在那如果您没有任何图片可以查看)。

+0

我认为这是一个很好的答案。它只是一个耻辱,使用预期的Web方法可能会被服务器端脚本行为不当行为毁掉。尽管如此,第二段的建议还是很有说服力的。 :) – jheriko 2009-02-17 03:20:06

1

如果你真的想知道一个图像文件是否有效,你实际上必须解码它(尽管你不需要存储这些位)。这是因为该文件可能大小错误或可能已损坏。

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

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

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

当你GET通过HTTP的资源,你必须使用Content-Type头,以确定如何处理内容。如果您已将其下载到本地文件,则真正的Web浏览器依赖的信息已经丢失。在很多情况下,该URL将与内容类型(例如,http://example.com/image.png作为Content-Type: image/png提供)。但是,你不能依靠这个。

+0

问题是当网站给你一个404错误页面而不是iamge – Lodle 2009-02-17 02:59:52