关键要点
引言
在PHP应用中,如果需要创建缩略图、应用图像滤镜或进行其他图像转换,就需要用到图像处理库。通常,你会选择GD或ImageMagick。但哪个库支持更多图像格式?哪个库速度更快?选择合适的库还需要考虑哪些其他因素?本文将解答这些问题!
可用性
GD和ImageMagick在PHP中可用,前提是它们已安装并与PHP本身配置好。 GD库从PHP 4.3开始默认包含,因此在大多数服务器环境中都可以使用。另一方面,ImageMagick并不总是可用,一些主机公司不提供它。
你可以运行几行代码来检查这两个库的可用性。 ImageMagick的queryFormats()
和GD的gd_info()
函数还可以列出每个库支持的图像格式:
<code class="language-php">if (extension_loaded('gd')) { print_r(gd_info()); } else { echo 'GD不可用。'; } if (extension_loaded('imagick')) { $imagick = new Imagick(); print_r($imagick->queryFormats()); } else { echo 'ImageMagick不可用。'; }</code>
支持的文件类型
执行上述代码后打印出的支持图像格式列表,首先表明ImageMagick库的功能远超GD。 GD仅支持JPG、PNG、GIF、WBMP、WebP、XBM和XPM文件,与ImageMagick库处理的超过一百种文件类型相比,数量非常有限。
你可能会认为你可能永远不会用到ImageMagick支持的所有这些不常见的格式,但这可能并非如此。在我的一个项目中,我不得不从GD切换到ImageMagick,仅仅是因为GD不支持TIFF文件。
功能
GD和ImageMagick都提供一些基本功能,例如:调整图像大小和裁剪、创建由自定义形状、文本和其他图像文件组成的图像、应用图像滤镜(更改亮度、对比度、着色等)。
如果你想更高级地处理图像,请查看ImageMagick库的所有功能。如ImageMagick示例页面所示——第一个和第二个——你可以以无数种方式转换、装饰或扭曲图像。
PHP ImageMagick类本身提供了331种方法,这是一个相当可观的数字(不,我没有手动数,我使用了ReflectionClass
;))。一方面,它显示了ImageMagick库的强大功能,另一方面,它也使得为特定用例查找和实现适当的方法变得困难。
性能
说实话,如果你只想创建一组缩略图或对图像应用简单的转换,你不必关心比较每个图像处理库的性能。
在我对典型服务器配置进行的一系列测试中,从3MB的数码相机JPG图像创建缩略图,使用ImageMagick大约需要0.6秒,使用GD大约需要0.5秒。因此,无论使用哪个库,整个过程都不会花费太多时间。浏览网络并查找这两个库的速度测试后,你会很快注意到,它们在性能方面都没有突出表现。有时GD库运行速度更快,有时是ImageMagick——这完全取决于用例。在决定是否使用GD或ImageMagick时,不要将此标准视为关键因素。
编码风格
如果你比较使用GD和ImageMagick库编写的相同图像转换代码,你会很快注意到它们之间存在一些差异。GD库通过一系列函数(如getimagesize()
或imagecreatetruecolor()
)提供,因此整个图像处理脚本需要以过程式风格编写。让我们来看一个创建JPG图像缩略图的示例:
<code class="language-php">if (extension_loaded('gd')) { print_r(gd_info()); } else { echo 'GD不可用。'; } if (extension_loaded('imagick')) { $imagick = new Imagick(); print_r($imagick->queryFormats()); } else { echo 'ImageMagick不可用。'; }</code>
由于在发生错误时不会抛出异常,因此所有错误处理都必须通过检查每个GD函数的结果来实现。你还必须处理具有十个参数的庞大函数,例如imagecopyresampled()
或imagecopyresized()
。我相信,如此多的参数并不是良好编码实践的例子。
另一个可能不太方便的事情是,读取和保存图像的函数取决于图像类型而有所不同。因此,如果你希望你的缩略图生成脚本处理不同的文件类型,你需要添加如下代码:
<code class="language-php">$src_img = imagecreatefromjpeg('source.jpg'); if (!$src_img) { die('读取源图像时出错。'); } $thumbnail = imagecreatetruecolor(800, 800); if (!$thumbnail) { die('创建目标图像时出错。'); } $result = imagecopyresampled($thumbnail, $src_img, 0, 0, 0, 0, 800, 800, 1600, 1600); if (!$result) { die('生成缩略图时出错。'); } $result = imagejpeg($thumbnail, 'destination.jpg'); if (!$result) { die('保存缩略图时出错。'); } $result = imagedestroy($thumbnail); if (!$result) { die('销毁图像时出错。'); }</code>
然后,你必须根据图像类型执行不同的函数才能以正确的格式保存目标图像。正如你所看到的,GD代码很快就会变得复杂。
只需查看负责相同操作的ImageMagick代码,你就会注意到区别:
<code class="language-php">switch ($image_type) { case 'gif': $src_img = imagecreatefromgif($path); break; case 'png': $src_img = imagecreatefrompng($path); break; case 'jpg': case 'jpeg': $src_img = imagecreatefromjpeg($path); break; default: return false; break; } //继续创建缩略图</code>
ImageMagick库可以通过Imagick类访问。因此,我们可以从面向对象编程范式的所有优点中获益。最简单的例子是处理错误的方式。使用ImageMagick库时,你只需将所有代码包装在一个try-catch块中,你的应用就可以安全地执行。
如上所示,负责创建缩略图的ImageMagick脚本不包含任何与源图像类型相关的代码。相同的代码可用于处理JPG图像以及PNG或TIF文件。如果你需要将源图像转换为另一种类型,只需在执行writeImage()
方法之前添加一行代码:
<code class="language-php">try { $imagick = new Imagick(); $imagick->readImage('source.jpg'); $imagick->thumbnailImage(800, 800); $imagick->writeImage('destination.jpg'); } catch (Exception $e) { die('创建缩略图时出错:' . $e->getMessage()); }</code>
是不是更清晰了?在我看来,使用GD库函数处理图像不如ImageMagick方便。当然,GD有一些可用的包装器使其面向对象,但在这一点上,它开始感觉像是在修补补丁。
流行度
由于GD库默认包含在所有新的PHP版本中,因此你可能在各种项目中比ImageMagick更频繁地看到这个库。当我的CakePHP项目需要一个负责处理图像上传和缩略图生成的组件时,我很快找到了一个基于GD的适合我需求的组件。你有时可能会发现一些编写良好的模块,允许你在两个图像处理库之间进行选择——例如Kohana框架图像库,但我担心它们并不常见。
替代方案
在决定如何在你的应用中处理图像处理时,你不必坚持使用某个PHP库。还有其他值得考虑的解决方案:
使用在PHP应用外部运行的图像处理脚本。在我的一个应用中,我必须创建一个网页,允许访问者在线转换图像,就在浏览器窗口中。我决定使用Caman.js JavaScript图像处理库,它做得很好。该库也可以用作嵌入在node.js平台中的后台脚本,node.js平台的普及率一直在稳步提高。
使用基于云的图像处理平台。基于云的解决方案可以为你完成这项工作——发送源文件后,你可以获取不同大小的缩略图或通过各种滤镜转换的图像。你不需要编写太多代码,而且不受服务器能力的限制。只需打开Google即可找到一些提供此类服务的公司。
检查你正在使用的组件的功能。你可能会惊讶地发现,你可以通过使用已连接到你的应用的服务来转换你的图像。例如,Dropbox API提供缩略图方法,允许你以五种可用尺寸之一获取JPG或PNG图像。检查你的库和API的文档,你可能会发现它们可以完成你需要的操作。
总结
如你所见,每个图像处理库都有其优缺点。GD库广泛可用,因此它可能在任何地方都能工作。由于它很流行,你很容易找到许多使用此库的示例和组件。获得帮助也更容易,因为更多的人可能熟悉GD库而不是ImageMagick。
ImageMagick支持更多文件类型,并且可以比GD库以更多方式转换图像。它还允许你编写更清晰和高质量的代码。
最后,还有其他替代方案,例如云图像处理服务,这些服务可能会完全消除对这两个库的需求。我希望本文能帮助你做出选择。
如果你对本文有任何疑问或意见,请随时在下方发表评论或通过Google 联系我。
Imagick与GD的常见问题解答(FAQ)
Imagick和GD都是功能强大的库,用于在PHP中进行图像处理。但是,它们在功能方面存在显着差异。 Imagick以其广泛的功能集而闻名,提供了各种图像处理选项,包括高级功能,如图层效果、图像滤镜和颜色调整。另一方面,GD更简单直接,专注于基本的图像处理任务,如调整大小、裁剪和简单的绘图功能。虽然GD可能足以完成简单的任务,但Imagick通常是更复杂图像处理需求的首选。
性能可能因具体任务和服务器环境而异。一般来说,由于其广泛的功能集,Imagick被认为比GD更消耗资源。但是,它也往往会产生更高质量的结果,尤其是在处理复杂的图像处理任务时。另一方面,GD通常更快且资源消耗更少,这使其成为简单任务或资源有限的环境的良好选择。
Imagick通常更适合处理大型图像。这是因为Imagick支持一项名为“基于磁盘的像素缓存”的功能,这允许它处理大于可用内存的图像。另一方面,GD不支持此功能,因此在处理大型图像时,尤其是在内存有限的服务器上,可能会遇到困难。
Imagick和GD都支持透明度,但它们处理透明度的方式略有不同。 Imagick支持更广泛的透明度选项,包括alpha通道和各种混合模式。另一方面,GD对透明度的支持更有限,有时难以处理复杂的透明度效果。
是的,可以在同一个项目中同时使用Imagick和GD。但是,需要注意的是,这两个库使用不同的语法和函数名,因此需要确保你的代码与两者兼容。此外,在同一个项目中同时使用这两个库可能会增加代码的复杂性,并可能导致性能问题,因此通常建议尽可能选择其中一个。
Imagick和GD都得到了广泛的支持并积极维护。但是,GD默认包含在大多数PHP安装中,使其更普遍可用。另一方面,Imagick通常需要单独安装,这有时会导致兼容性问题。
Imagick和GD都有广泛的文档和活跃的社区支持。但是,由于其更长的历史和更广泛的使用,GD在线上通常有更多现成的资源和教程。 Imagick虽然也有很好的文档,但可能需要更多挖掘才能找到具体的解决方案或示例。
Imagick和GD都被认为是安全的库。但是,与任何软件一样,如果使用不当,它们也可能被利用。务必始终使用最新版本的库,并遵循安全编码的最佳实践。
选择Imagick还是GD取决于项目的具体需求。如果需要高级图像处理功能,或者需要处理大型图像,Imagick可能是更好的选择。但是,如果正在处理一个更简单的项目,或者在资源有限的环境中工作,GD可能是更好的选择。
虽然从技术上讲可以在项目中途从GD切换到Imagick(反之亦然),但这通常不建议这样做。这是因为这两个库使用不同的语法和函数名,因此切换可能需要对代码进行重大更改。如果正在考虑切换,通常最好在项目开始时做出决定。
以上是Imagick vs GD的详细内容。更多信息请关注PHP中文网其他相关文章!