我正在寫一個程序,從網上下載信息,其中一部分是圖像。檢查有效圖像
目前我遇到問題,下載圖像的代碼與顯示它們的代碼不同(在mvc下)。如果404發佈或圖像下載失敗,顯示代碼會彈出一條消息,我想避免它。
有沒有簡單的方法來檢查圖像是否有效?我只關心jpg,gif和png。
注意:我不在乎讀取圖像數據,只是爲了檢查它是否是有效的圖像格式。
我正在寫一個程序,從網上下載信息,其中一部分是圖像。檢查有效圖像
目前我遇到問題,下載圖像的代碼與顯示它們的代碼不同(在mvc下)。如果404發佈或圖像下載失敗,顯示代碼會彈出一條消息,我想避免它。
有沒有簡單的方法來檢查圖像是否有效?我只關心jpg,gif和png。
注意:我不在乎讀取圖像數據,只是爲了檢查它是否是有效的圖像格式。
是否要檢查下載是否成功?或者你想檢查下載的是什麼,實際上是一個圖像?
在前一種情況下,檢查的唯一方法是嘗試訪問它並查看您獲得的HTTP響應代碼類型。您可以發送一個HTTP HEAD
請求來獲取響應代碼,而無需實際下載圖像,但如果您只是繼續下載圖像(如果成功),則發送單獨的HEAD
請求似乎浪費時間(和帶寬)。
或者,如果您確實想檢查您下載的內容是否是有效的映像文件,則必須讀取整個文件以檢查是否存在損壞。但是,如果您只想檢查文件擴展名是否準確,那麼檢查文件的前幾個字節就足夠了。取決於使用哪種GIF規範,所有GIF圖像都以ASCII文本GIF87
或GIF89
開頭。 PNG圖像以ASCII文本PNG
開頭,並且JPEG圖像具有一些幻數,根據我所看到的JPEG,它似乎是0xd8ffe0ff
。 (你應該做一些研究和檢查,試試維基百科的鏈接)但請記住,即使圖像的前幾個字節,你需要發送一個HTTP請求,可以返回一個404(並在那如果您沒有任何圖片可以查看)。
如果你真的想知道一個圖像文件是否有效,你實際上必須解碼它(儘管你不需要存儲這些位)。這是因爲該文件可能大小錯誤或可能已損壞。
如果您使用HTTP庫進行下載,您應該能夠檢查標題並知道您得到404錯誤而不是真正的有效負載。查看您正在使用的庫的文檔。
如果你找回了一個文件,並且你想看看它是否是一個沒有完全解碼的圖片,那麼你至少需要檢查頭部的有效性。 libpng和libjpeg分別提供了對png和jpeg文件的低級訪問。您還可以查看更高級別的庫,如ImageMagick,Microsoft的MFC或任何適合您的平臺的庫。
感謝您的答案傢伙。我已經準備好下載文件了,所以我只用檢查魔術數字作爲我使用的前端(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;
}
當你GET
通過HTTP的資源,你必須使用Content-Type
頭,以確定如何處理內容。如果您已將其下載到本地文件,則真正的Web瀏覽器依賴的信息已經丟失。在很多情況下,該URL將與內容類型(例如,http://example.com/image.png
作爲Content-Type: image/png
提供)。但是,你不能依靠這個。
問題是當網站給你一個404錯誤頁面而不是iamge – Lodle 2009-02-17 02:59:52
我認爲這是一個很好的答案。它只是一個恥辱,使用預期的Web方法可能會被服務器端腳本行爲不當行爲毀掉。儘管如此,第二段的建議還是很有說服力的。 :) – jheriko 2009-02-17 03:20:06