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

2022-08-30 09:37:35

是否有可能找出在PHP中编码为base64字符串的图像的类型?

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


答案 1

FileInfo可以为您做到这一点:

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

$f = finfo_open();

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

答案 2

如果由于这些函数的依赖关系而不想使用这些函数,则可以使用数据的第一个字节:

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

推荐