2011-05-19 52 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类型的详尽列表,你可以看看这里: