2011-05-19 53 views
34

是否有可能找到在PHP中以base64字符串編碼的圖像的類型?從PHP中的base64字符串中檢測圖像類型

我沒有訪問原始圖像文件的方法,只是編碼的字符串。從我看到的,imagecreatefromstring()可以從字符串表示形式(在從base64解碼之後)創建圖像資源,但它會自動檢測圖像類型,而圖像資源本身是一種特殊的PHP表示形式。如果我想再次將圖像另存爲文件,我不知道是否將類型保存爲與創建字符串表示形式的原始類型相對應的類型。

+0

有重複的地方,但我不知道在哪裏。 – 2011-05-19 16:12:42

回答

73

FileInfo可以爲你做的:

$encoded_string = "...."; 
$imgdata = base64_decode($encoded_string); 

$f = finfo_open(); 

$mime_type = finfo_buffer($f, $imgdata, FILEINFO_MIME_TYPE); 
+0

不錯,可能和'getimagesize()'一樣可靠。 +1 – 2011-05-19 16:14:39

+0

不確定getimagesize在內部使用什麼,但人們會希望如此。 – 2011-05-19 16:15:56

+1

@Marc B它讀取頭文件字節,就像'fileinfo'一樣。 – 2011-05-19 16:16:45

3

通過@Marc b所示的方式是最好的。

如果FInfo不可用,我知道的唯一方法是將數據存儲到文件中,然後在其上運行getimagesize()

2

如果您對文件格式結構知之甚少,理論上可以查看文件的頂部字節,直到找出它是哪種類型的文件。

例如,GIF圖像總是以以下字節GIF89a開頭。如果您可以在文件開頭找到該字符串,則可以合理確定它是GIF圖像,並絕對確定它不是任何其他圖像格式。 (它可能仍然是一個文本文件,但恰巧以'GIF89a'開頭;你必須解析更多的文件以絕對確定)

同樣,PNG文件的字符串PNG相當接近開始(這不是剛剛開始;再次,你需要研究文件格式的細節,以幫助你確定你需要知道多少確定)。

JPEGs在其標題中也包含可識別的字符串,儘管這些字符串更加多樣和複雜。你可能想看看字符串Exif

獲取文件格式定義肯定會給你更多的準確性,但根據你需要的準確度,你可以通過在二進制編輯器中打開一些圖像文件來了解它們是如何結構化的。

這些資源可以幫助您:

32

如果你不想使用,因爲他們依賴的這些功能,您可以使用的第一個字節數據:

function getBytesFromHexString($hexdata) 
{ 
    for($count = 0; $count < strlen($hexdata); $count+=2) 
    $bytes[] = chr(hexdec(substr($hexdata, $count, 2))); 

    return implode($bytes); 
} 

function getImageMimeType($imagedata) 
{ 
    $imagemimetypes = array( 
    "jpeg" => "FFD8", 
    "png" => "89504E470D0A1A0A", 
    "gif" => "474946", 
    "bmp" => "424D", 
    "tiff" => "4949", 
    "tiff" => "4D4D" 
); 

    foreach ($imagemimetypes as $mime => $hexbytes) 
    { 
    $bytes = getBytesFromHexString($hexbytes); 
    if (substr($imagedata, 0, strlen($bytes)) == $bytes) 
     return $mime; 
    } 

    return NULL; 
} 

$encoded_string = "...."; 
$imgdata = base64_decode($encoded_string); 
$mimetype = getImageMimeType($imgdata); 
+0

將它們存儲爲字節值(例如\ xFF \ xD8)意味着您可以只進行字符串比較。 – 2014-11-13 11:48:34

+0

太棒了! Thx – Jey10 2016-03-29 19:56:05

+0

謝謝你的工作。對於某些使用codeigniter的人,不要忘記在每個被調用的函數中添加$ this->。 – bxorcloud 2016-07-27 04:14:10

6

@Marc B給出的解決方案對我來說是最好的解決方案(如果我們的php版本大於5.3.0,我們可以使用@Aaron Murgatroyd給出的解決方案)。

我想對此解決方案稍加補充。

要獲得的圖像類型,你可以做這樣的:

$split = explode('/', $mime_type); 
$type = $split[1]; 

事實上,(如果你不知道的話)對圖像的MIME類型:圖像/類型類型可以是PNG或GIF或JPEG或...

希望可以幫助某人,並感謝@Marc B爲他的解決方案。

對於MIME類型的詳盡列表,你可以看看這裏: