2009-02-17 58 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