如何使用php验证图像格式

Posted

技术标签:

【中文标题】如何使用php验证图像格式【英文标题】:how to verify an image format with php 【发布时间】:2013-04-04 05:36:59 【问题描述】:

我需要验证一个应用程序的大量图像文件,情况是我有 10 个目录,每个目录有近 10,000 个图像,大约有 100,000 个文件。这些文件应该是 gif 文件,但其中很多(实际上意味着很多)是 jpg 文件,设计人员将扩展名从 .jpg 更改为 .gif 而不转换文件格式。这导致应用程序崩溃,它使用这些图像创建 pdf 文件,如果我告诉程序使用文件 somefile.gif 但它确实是一个扩展名为 pdf 的 jpg 创建者崩溃。我不想在 irfanview 或 photoshop 中打开每个文件来验证格式,然后在必要时对其进行修改。 php 或其他语言中是否有库、类、插件或其他东西可以告诉我在扩展名中没有基础但在文件头中的文件格式?

我找不到任何想法来做这件事,有人可以帮助我吗?

非常感谢!!!

【问题讨论】:

见***.com/questions/134833/… 【参考方案1】:

我个人使用exif_imagetype 进行真正的验证,而不是检查扩展名或mime 类型。

【讨论】:

exif_imagetype 不适用于 true 验证。它甚至比getimagesize(但完全相同的联赛)更不密集。 @M8R-1jmw5r: exif_imagetype() 读取图像的第一个字节并检查其签名。然后,使用 PHP 原生函数,它是最好的。 为了区分 gif 和 jpeg 可能,是的。如果您还需要颜色深度等,那也没有用。例如。 PDF 创建者可能会因 CMYK jpegs 崩溃;)即使 gdlib 被禁用,getimagesize() 也可用。 问题是关于文件类型的。不是颜色深度。 getimagesize() 提供的额外信息肯定有助于调试目的,但如果我们只检查文件是实际的 JPEG 还是 GIF,那么 exif_imagetype 是执行此检查的最有效方法。当您说它“不适用于 true 验证”时,我不确定您的意思。你能解释一下读取图像文件的字节签名不是验证吗? thnxs @maiorano84,它真的对我有用,现在知道了真正的扩展名,我可以在使用 pdf 创建器使用文件之前使用 gdlib 操作格式。【参考方案2】:

如果您需要在 gif 或 jpeg 之间进行查找,函数 getimagesize() 可以为您完成。见http://php.net/getimagesize。

list(,,$imageType) = getimagesize($path);
if ($imageType === IMAGETYPE_GIF) 
    // GIF found

【讨论】:

以上是关于如何使用php验证图像格式的主要内容,如果未能解决你的问题,请参考以下文章

GD中支持的格式使用php保存图像

GD 中支持的格式以使用 php 保存图像

如何使用GD在php中特定区域的图像上放置一些文本

PHP中的自动图像格式检测

GD库处理图像

如何使用干预图像laravel将webp图像转换为jpeg或png