在PHP中从base64字符串中检测图像类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在PHP中从base64字符串中检测图像类型相关的知识,希望对你有一定的参考价值。
是否有可能找出在php中编码为base64字符串的图像类型?
我没有访问原始图像文件的方法,只有编码的字符串。从我所看到的,imagecreatefromstring()
可以从字符串表示(从base64解码后)创建图像资源,但它会自动检测图像类型,图像资源本身是一个特殊的PHP表示。如果我想再次将图像保存为文件,我不知道我保存的类型是否与创建字符串表示的原始类型相对应。
FileInfo可以为您做到这一点:
$encoded_string = "....";
$imgdata = base64_decode($encoded_string);
$f = finfo_open();
$mime_type = finfo_buffer($f, $imgdata, FILEINFO_MIME_TYPE);
如果由于它们的依赖性而不想使用这些函数,则可以使用数据的第一个字节:
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);
@Marc B给出的解决方案对我来说是最好的(如果我们的php版本> 5.3.0,否则我们可以使用@Aaron Murgatroyd给出的解决方案)。
我想补充一点这个解决方案。
要获取图像类型,您可以这样做:
$split = explode( '/', $mime_type );
$type = $split[1];
事实上,(如果你不知道)图像的mime类型是:image / type和type可以是png或gif或jpeg或者......
希望能帮到某人并感谢@Marc B的解决方案。
有关mime类型的详尽列表,您可以在此处查看:
@Marc B显示的方式是最好的。
如果FInfo
不可用,我知道的另一种方法是将数据存储到文件中,并在其上运行getimagesize()
。
如果您知道关于文件格式结构的最小数量,理论上您可以查看文件的顶部字节,直到您可以确定它是什么类型的文件。
例如,GIF图像始终以以下字节GIF89a
开头。如果你可以在文件的开头找到该字符串,你可以合理地确定它是一个GIF图像,并且绝对肯定它不是任何其他图像格式。 (它可能仍然是一个文本文件,恰好以'GIF89a'开头;你必须解析更多的文件才能绝对确定)
同样地,PNG文件的字符串PNG
在开始时非常接近(它还没有开始;再次,你需要研究文件格式细节,以帮助你确定你需要知道多少才能确定)。
JPEG还在其标题中包含可识别的字符串,尽管这些字符串更加多样和复杂。您可能想要查找字符串Exif
。
获取文件格式定义肯定会提供更高的准确性,但根据您需要的准确程度,您可以通过在二进制编辑器中打开一些图像文件来了解文件格式,以了解它们的结构。
这些资源可以帮助您:
关注PHP.NET Fileinfo: -
$finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
foreach (glob("*") as $filename) {
echo finfo_file($finfo, $filename) . "
";
}
finfo_close($finfo);
以上是关于在PHP中从base64字符串中检测图像类型的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PHP 中将图像从 base 64 转换为它们的文件类型?