有沒有什麼快速的方法可以確定某些任意圖像文件是png
文件還是jpeg
文件或者它們都不是?C++ - 檢測文件是PNG還是JPEG
我敢肯定有一些方法,這些文件可能有某種自己的簽名,應該有一些方法來區分它們。
如果可能,您還可以提供相應例程的名稱:libpng
/libjpeg
/boost::gil::io
。
有沒有什麼快速的方法可以確定某些任意圖像文件是png
文件還是jpeg
文件或者它們都不是?C++ - 檢測文件是PNG還是JPEG
我敢肯定有一些方法,這些文件可能有某種自己的簽名,應該有一些方法來區分它們。
如果可能,您還可以提供相應例程的名稱:libpng
/libjpeg
/boost::gil::io
。
除了:
png_read_image
拋出std::ios_base::failure
如果該文件不是有效的PNG文件。jpeg_read_image
如果文件不是有效的JPEG文件,則會拋出std::ios_base::failure
。與其他Boost GIL例程類似。如果您只需要該類型,則可能需要嘗試僅讀取dimensions,而不是加載整個文件。
查看文件開頭的magic number。從維基百科頁面:
JPEG圖像文件開始FF D8與FF D9結束。 JPEG/JFIF文件 包含「JFIF」(4A 46 49 46)的ASCII碼作爲空終止字符串。 JPEG/Exif文件包含「Exif」(45 78 69 66)的ASCII代碼 ,也可以作爲 以空字符結尾的字符串,然後是 關於該文件的更多元數據。
PNG圖像文件開始與文件標識爲 PNG文件並允許 普通文件傳輸問題檢測一個8字節的簽名:\ 211 P NG \ r \ n \ 032 \ n
像PNG和JPG這樣的圖像文件類型具有明確定義的文件格式,其中包括標識它們的簽名。你所要做的就是讀足夠的文件來讀取簽名。
您所需要的簽名是有據可查的:
http://en.wikipedia.org/wiki/Portable_Network_Graphics#File_header
這個問題基本上是由上面的答覆回答的,但我想我會添加以下內容:如果您需要確定超出「JPEG,PNG,其他」的文件類型,總是有libmagic。這就是Unix實用程序文件的功能,這在許多現代操作系統上的確非常神奇。
還有一個問題說,所謂jpeg_read_image不會引發異常。 – jiggunjer 2015-06-17 17:03:27