我对ImageMagick
有疑问。我搜索了很多,但未能找到解决方案。我的问题与输出到JPEG XR
格式有关。我正尝试在PHP 7.0/7.1
和Windows 10
服务器Linux Debian 9
上执行此操作。
我的代码:
<?php
if (TRUE !== extension_loaded('imagick')) {
throw new Exception('Imagick extension is not loaded.');
}
$image = new Imagick();
$image->newImage(100, 100, new ImagickPixel('red'));
// $image->setImageFormat('jpg'); // <-- It works
$image->setImageFormat('jxr'); // <-- Fatal error: Uncaught ImagickException: UnableToOpenModuleFile
header("Content-Type: image/" . $image->getImageFormat());
echo $image;
$image->destroy();
Windows应用
C:\Users\Andrei>JxrDecApp.exe
JPEG XR Decoder Utility
Copyright 2013 Microsoft Corporation - All Rights Reserved
...
C:\Users\Andrei>JxrEncApp.exe
JPEG XR Encoder Utility
Copyright 2013 Microsoft Corporation - All Rights Reserved
...
JxrDecApp.exe
和JxrEncApp.exe
可从任何目录获取!
Linux软件包:
root@Server:~# dpkg-query -l | grep jxr
ii libjxr-tools 1.1-6+b1 amd64 JPEG-XR lib - command line apps
ii libjxr0:amd64 1.1-6+b1 amd64 JPEG-XR lib - libraries
root@Server:~# dpkg-query -l | grep imagick
ii php-imagick 3.4.3~rc2-2 amd64 Provides a wrapper to the ImageMagick library
root@Server:~# JxrDecApp
JPEG XR Decoder Utility
Copyright 2013 Microsoft Corporation - All Rights Reserved
...
root@Server:~# JxrEncApp
JPEG XR Encoder Utility
Copyright 2013 Microsoft Corporation - All Rights Reserved
...
Windows上的致命错误:
Uncaught ImagickException:UnableToOpenModuleFile`C:\ WINDOWS \ system32 \ config \ systemprofile \ AppData \ Local \ ImageMagick \ IM_MOD_RL_jxr_.dll':D:\ www中没有这样的文件或目录@ warning / module.c / GetMagickModulePath / 830第11行的\ temp \ jxr \ index.php
Linux上的致命错误:
无法设置图像格式
Wiki ImageMagick:
支持的图像格式:
JXR | RW | JPEG扩展范围|需要jxrlib委托库。将JxrDecApp和JxrEncApp应用程序放在执行路径中。 Read more this
更新日志:
2013-04-29 6.8.5-3 Cristy
为jpeg:extent工件添加DeleteImageArtifact()(感谢Jimmy Xie @Microsoft) 添加对JXR / WDP图像格式的支持。
更新
来自Windows上PHP的 echo $_SERVER['PATH'];
:
c:\Program Files\ImageMagick-6.9.3-7-vc14-x64\bin\;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Program Files\Microsoft MPI\Bin\;C:\Windows\System32;C:\Windows;C:\Windows\System32\wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\130\DTS\Binn\;C:\Program Files\Microsoft SQL Server\130\DTS\Binn\;C:\Program Files\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\Client SDK\ODBC\130\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\140\Tools\Binn\;C:\Program Files (x86)\Microsoft SQL Server\140\DTS\Binn\;C:\Program Files (x86)\Microsoft SQL Server\140\Tools\Binn\ManagementStudio\;C:\Program Files\Git\cmd;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\Program Files\Java\JDK18~1.0_1\bin;C:\Program Files\JetBrains\IntelliJ IDEA 2017.2.1\plugins\maven\lib\maven3\bin;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\nodejs\;C:\Program Files\JetBrains\IntelliJ IDEA 2017.2.1\bin\;C:\Program Files (x86)\Skype\Phone\;C:\WINDOWS\system32\config\systemprofile\AppData\Local\Microsoft\WindowsApps
DIR:
C:\Users\Andrei>dir "c:\Program Files\ImageMagick-6.9.3-7-vc14-x64\bin\*jxr*"
11.11.2017 22:53 464 896 JXRDecApp.exe
11.11.2017 22:53 469 504 JXREncApp.exe
来自Linux上的PHP的 echo $_SERVER['PATH'];
:
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
执行:
root@Server:~# which JxrEncApp
/usr/bin/JxrEncApp
root@Server:~# which JxrDecApp
/usr/bin/JxrDecApp
问题:
如何添加对JXR图像格式的支持?
答案 0 :(得分:0)
支持这种格式,但您需要做一些“魔法”&#39;使它工作。只有在将文件JXRDecApp.exe复制到bin目录并从具有.jxr扩展名的磁盘上的文件中读取时,才能读取JXR文件。不支持从字节数组中读取。如果jxrlib项目(http://jxrlib.codeplex.com)的代码可以成为ImageMagick的一部分,那就太好了。也许我应该在ImageMagick项目中为此创建一个问题。您需要自己编译JXRDecApp.exe,因为没有可用的二进制文件。
因此支持JXR格式,但不是您想要应用它的方式。但是,转换可以通过StackOverflow here中描述的命令行完成,或者像这样。
convert input.jpg jxr:output.jpg
剩下的就是编写一个执行此命令的脚本来为您进行转换。确保您正确保护该脚本及其输入和输出。祝你好运!
来源:
答案 1 :(得分:-1)
某些PHP软件包附带了自己的Imagick软件包,而不是使用系统软件包。然后,您可能会发现命令行支持的内容以及PHP支持的内容有所不同。
在源代码中,PHP直接从Imagick本身获取支持的格式列表。
如果它不是不同的版本,也许有一些隐藏的抽象,其中jxr是具有一些特定选项的另一个父格式的别名。