在PHP中从base64字符串检测图像类型

ifsvaxew  于 2023-02-11  发布在  PHP
关注(0)|答案(8)|浏览(276)

有没有可能找出PHP中编码为base64 String的图像的类型?
我没有访问原始图像文件的方法,只有编码的字符串。据我所知,imagecreatefromstring()可以从字符串表示创建图像资源(从base64解码后),但是它会自动检测图像类型,图像资源本身是一个特殊的PHP表示。如果我想再次将图像保存为文件,我不知道保存它的类型是否对应于创建String表示的原始类型。

umuewwlo

umuewwlo1#

FileInfo可以为您做到这一点:

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

$f = finfo_open();

$mime_type = finfo_buffer($f, $imgdata, FILEINFO_MIME_TYPE);
ep6jt1vc

ep6jt1vc2#

如果由于这些函数的依赖性而不想使用它们,则可以使用数据的前几个字节:

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);

引用:-check here the list of file signatures

x6yk4ghg

x6yk4ghg3#

@Marc B给出的解决方案对我来说是最好的(如果我们的php版本〉5.3.0,否则我们可以使用@Aaron Murgatroyd给出的解决方案)。
我想对这个解决方案给予一点补充。
要获取图像类型,可以按如下方式操作:

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

实际上,(如果您不知道的话)图像的mime类型是:图像/类型类型可以是png或gif或jpeg或...
希望这能帮助一些人,并感谢@Marc B的解决方案。
有关mime类型的详尽列表,请查看此处:

smdnsysy

smdnsysy4#

@Marc B展示的方式是最好的。
如果FInfo不可用,我知道的唯一其他方法是将数据存储到一个文件中,然后在该文件上运行getimagesize()

zzoitvuj

zzoitvuj5#

下面的代码将从mime类型中获取图像类型。

<?php 
$base64 = "data:image/png;base64,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";

$image_info = getimagesize($base64);

$extension = (isset($image_info["mime"]) ? explode('/', $image_info["mime"] )[1]: "");

echo $extension;
 
?>
ttvkxqim

ttvkxqim6#

如果您对文件格式结构有最起码的了解,理论上您可以查看文件的顶部字节,直到您能够确定它是什么类型的文件。
例如,GIF图像总是以GIF89a开头,如果你能在文件开头找到这个字符串,你就可以合理地确定它是一个GIF图像,并且绝对确定它不是任何其他格式的图像(尽管它仍然可能是一个文本文件,只是碰巧以'GIF 89 a'开头;您必须解析文件的更多部分才能绝对确定)
类似地,PNG文件的字符串PNG位于非常接近开头的位置(它不是在最开头;同样,您需要研究文件格式的细节,以帮助您确定需要知道多少才能确定)。
JPEG在其标头中也包含可识别的字符串,尽管这些字符串更加多样和复杂。您可能需要查找字符串Exif
获得文件格式定义肯定会给您带来更高的准确性,但取决于您需要的准确性,您可能只需在二进制编辑器中打开一些图像文件,看看它们是如何构造的,就可以充分了解文件格式。
这些资源可以帮助您:

ee7vknir

ee7vknir7#

遵循PHP.NET Fileinfo:-

$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
foreach (glob("*") as $filename) {
echo finfo_file($finfo, $filename) . "\n";
}
finfo_close($finfo);
zsohkypk

zsohkypk8#

您可以使用magic numbers来检测MIME类型(在这里检查list of file signatures)。然而,文件签名不是100%可靠的,您很容易遇到误报。当然,当这样的解决方案绰绰有余时,也会有任务。
因此,如果你有一个Base64字符串,并希望使用文件签名来识别其MIME类型,你不需要解码Base64。一个更快的方法是将文件签名存储为Base64,只需检查输入是否以其中之一开头。

<?php 

function detectMimeType(string $base64) 
{
    $signaturesForBase64 = [
        'JVBERi0'     => "application/pdf",
        'R0lGODdh'    => "image/gif",
        'R0lGODlh'    => "image/gif",
        'iVBORw0KGgo' => "image/png",
        '/9j/'        => "image/jpeg"
    ];
    
    foreach($signaturesForBase64 as $sign => $mimeType) 
    {
        if(strpos($base64, $sign) === 0) {
            return $mimeType;
        }
    }

    return false;
}

var_dump(detectMimeType('R0lGODdhAQABAPAAAP8AAAAAACwAAAAAAQABAAACAkQBADs=')); // image/gif
var_dump(detectMimeType('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAADElEQVR42mP4z8AAAAMBAQD3A0FDAAAAAElFTkSuQmCC')); // image/png
var_dump(detectMimeType('JVBERi0xLjUKJYCBgoMKMSAwIG9iago8PC9GaWx0ZXIvRmxhdGVEZWNvZGUvRmlyc3QgMTQxL04gMjAvTGVuZ3')); // application/pdf
var_dump(detectMimeType('/9j/4AAQSkZJRgABAQAAZABkAAD/2wCEABQQEBkSGScXFycyJh8mMi4mJiYmLj41NTU1NT5EQUFBQUFBRERERERERERE')); // image/jpeg

我从this Js Que-Answer得到了这个解决方案
此外:这个也是properly的作品

相关问题