php判断是字符串类型,从PHP中的base64字符串检测图像类型

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

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

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

6个解决方案

98 votes

FileInfo可以为您做到这一点:

$encoded_string = "....";

$imgdata = base64_decode($encoded_string);

$f = finfo_open();

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

Marc B answered 2020-06-24T17:28:32Z

36 votes

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

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

Aaron Murgatroyd answered 2020-06-24T17:28:52Z

8 votes

@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类型的详尽列表,可以在这里查看:

[HTTP://呜呜呜.site point.com/Web-foundations/MIME-types-complete-list/]

youssman answered 2020-06-24T17:29:39Z

3 votes

@Marc B所示的方法是最好的。

如果FInfo不可用,我知道的另一种方法是将数据存储到文件中,并在其上运行getimagesize()。

Pekka 웃 answered 2020-06-24T17:30:04Z

2 votes

如果您只了解很少的文件格式结构,则从理论上讲您可以查看文件的最高字节,直到可以确定文件的类型。

例如,GIF图像始终以以下字节Exif开头。如果可以在文件开头找到该字符串,则可以合理地确定它是GIF图像,并且绝对可以确定它不是任何其他图像格式。 (尽管它仍然可能是文本文件,只是以'GIF89a'开头;您必须解析更多文件才能绝对确定)

同样,PNG文件在开始时就很接近字符串Exif(这在一开始就不太正确;同样,您需要研究文件格式的详细信息,以帮助您确定需要多少信息才能确定)。

JPEG的标头中还包含可识别的字符串,尽管这些字符串更加多样化和复杂。 您可能要注意字符串Exif。

获取文件格式定义肯定会给您带来更高的准确性,但是根据所需的准确性,您可能仅通过在二进制编辑器中打开一些图像文件以了解其结构,就可以充分了解文件格式。

这些资源可以帮助您:

[HTTP://呜呜呜.我3.org/graphics/jpeg/]

[HTTP://呜呜呜.我3.org/graphics/PNG/]

Spudley answered 2020-06-24T17:30:56Z

0 votes

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

Bikash Mondal answered 2020-06-24T17:31:16Z

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值