网上搜索的安装方法会报如下错误
PHP Warning: PHP Startup: Unable to load dynamic library 'php_imagick.dll' (tried: D:\phpstudy_pro\Extensions\php\php7.0.9nts\ext\php_imagick.dll (找不到指定的模块。), D:\phpstudy_pro\Extensions\php\php7.0.9nts\ext\php_php_imagick.dll.dll (找不到指定的模块。)) in Unknown on line 0
参考了
PHP7.0版本报错
和
PHP7.4版本报错
这两篇文章后总结出如何在PHP7.0版本安装imagick扩展的步骤,
7.1、7.2、7.3、7.4版本的安装留待以后测试。
测试完成,此流程亦适用于7.1--7.4。
需要下载的文件
ImageMagick
imagick
Ghostscript
打印phpinfo(),查看自己的php版本信息,如下图红框部分
我的php版本是7.0、64位、NTS、VC14、Thread Safety是disabled,这些信息下面下载文件会用到
1.下载并配置ImageMagick
下载地址:
windows.php.net/downloads/p…
我的版本是VC14、64位,所以下载的是 ImageMagick-6.9.3-7-vc14-x64.zip
将下载后的文件解压缩,把bin目录下的文件复制到在C盘中新建文件夹ImageMagick-6.9.3-7-vc14-x64中
新建环境变量:C:\ImageMagick-6.9.3-7-vc14-x64
新建系统变量:MAGICK_HOME,其值为:C:\ImageMagick-6.9.3-7-vc14-x64
2.下载并配置imagick
PHP 7.4、8.0、8.1版本
PHP 7.1、7.2、7.3、7.4版本
PHP 5.5、5.6、7.0、7.1版本
我的版本是PHP7.0、64位、NTS、Thread Safety是disabled故下载 7.0 Non Thread Safe (NTS) x64
将下载后的文件解压缩,把php_imagick.dll文件复制到php根目录的ext目录里,我使用的是phpstudy,复制的路径如图
然后在php根目录下的php.ini文件中添加
extension = php_imagick.dll
至此Imagick扩展安装完成,重启电脑后可在phpinfo()中看到
3.下载并配置Ghostscript
下面贴出64位版本的下载地址,32位请自行去github下载:
github.com/ArtifexSoft…
gs918w64.exe
gs919w64.exe
gs920w64.exe
gs921w64.exe
gs922w64.exe
gs923w64.exe
gs924w64.exe
gs925w64.exe
gs926aw64.exe
gs927w64.exe
gs950w64.exe
gs951w64.exe
gs952w64.exe
gs9530w64.exe
gs9531w64.exe
gs9532w64.exe
gs9533w64.exe
gs9540w64.exe
gs9550w64.exe
运行下载后的文件会自动安装,安装完毕后将bin的目录添加到环境变量中
至此所有准备工作已完成。
3.php代码
public function pdfToimg($pdf, $path)
$im = new Imagick();
$im->setCompressionQuality(100);
$im->setResolution(120, 120);
$im->readImage($pdf);
$canvas = new Imagick();
$imgNum = $im->getNumberImages();
foreach ($im as $k => $sub) {
$sub->setImageFormat('png');
$sub->setResolution(120, 120);
$sub->stripImage();
$sub->trimImage(0);
$width = $sub->getImageWidth() + 10;
$height = $sub->getImageHeight() + 10;
if ($k + 1 == $imgNum) {
$height += 10;
}
$canvas->newImage($width, $height, new ImagickPixel('white'));
$canvas->compositeImage($sub, Imagick::COMPOSITE_DEFAULT, 5, 5);
$canvas->resetIterator();
$canvas->appendImages(true)->writeImage($path);
return "转换成功";
在运行代码后报错 500 Internal Server Error,经排查问题是出在 $im->readImage($pdf);
处。百度后找到解决办法是更换gs版本,于是便从gs918开始一个个尝试。
尝试过所有gs版本后还是未能解决问题,又找到了一个办法是在bin的同级目录下复制并粘贴gswin64.exe/gswin64c.exe,改名为gs.exe。尝试后还是未能解决问题。
最后受到启发是不是程序没加载imagick或者是$pdf的路径不对,于是有如下调试
if (!extension_loaded('imagick'))
die('Imagick is not installed');
}else{
echo 'Imagick installed<hr>';
$pdf = "D:\phpstudy_pro\WWW\www.nilin.ceshi.com\test11.pdf";
if(file_exists($pdf)){
echo "$pdf exists.<br>";
else{
die("$pdf doesnt exist.");
问题出在pdf地址不对,可是这个目录下的pdf文件确实存在。最终我想出是不是 $pdf = "D:\phpstudy_pro\WWW\www.nilin.ceshi.com\test11.pdf";
中""
的缘故。于是尝试将其改为''
后问题意外的解决了。但是不理解的地方一是我尝试过将$pdf
文件路径使用单引号,$path
使用双引号的时候也能成功运行。二是将png转为jpg,路径也均是用""
即 $pdf = "D:\phpstudy_pro\WWW\www.nilin.ceshi.com\aaaa.png";$path = "D:\phpstudy_pro\WWW\www.nilin.ceshi.com\bbbb.jpg";
也能成功运行。 为什么pdf文件路径使用双引号就不行了呢? 原因出在:双引号下的\t会被转义,如下图红框部分,所以实际的路径变成了D:\phpstudy_pro\WWW\www.nilin.ceshi.com est11.pdf
,导致readImage($pdf)
读取的是无效路径。
建议小伙伴们遇到类似问题后把以上途径都尝试一下,毕竟我这只是其中的一种情况。不一定适用于所有人。
php版本升级到7.2.9时,按照上文流程配置后仍报错PHP Warning: PHP Startup: Unable to load dynamic library 'php_imagick.dll' (tried: D:\phpstudy_pro\Extensions\php\php7.2.9nts\ext\php_imagick.dll (找不到指定的模块。), D:\phpstudy_pro\Extensions\php\php7.2.9nts\ext\php_php_imagick.dll.dll (找不到指定的模块。)) in Unknown on line 0
。排查后发现是丢失了VCOMP140.dll
文件,下载安装Visual C++ Redistributable for Visual Studio 2015后解决问题。至此测试了php 7.1、7.3、7.4版本下均正常运行。