我有一个ImageMagick
的问题。 我搜查了很多,但没有find解决办法。 我的问题是输出JPEG XR
图像。 我试图在Windows 10
和Linux Debian 9
服务器上的PHP 7.0/7.1
执行此操作。
我的代码:
<?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上的结果phpinfo():
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上的结果phpinfo():
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上的致命错误 :
未被捕获的ImagickException:UnableToOpenModuleFile C:\ WINDOWS \ system32 \ config \ systemprofile \ AppData \ Local \ ImageMagick \ IM_MOD_RL_jxr_.dll:在D:\ www \ temp \中没有这样的文件或目录@ warning / module.c / GetMagickModulePath / jxr \ index.php在第11行
Linux上的致命错误 :
无法设置图像格式
Wiki ImageMagick:
支持的图像格式:
JXR | RW | JPEG扩展范围| 需要jxrlib委托库。 将JxrDecApp和JxrEncApp应用程序放在执行path中。 阅读更多内容
更新日志:
2013-04-29 6.8.5-3 Cristy
为jpeg:extent工件添加DeleteImageArtifact()(感谢Jimmy Xie @ Microsoft)。
添加对JXR / WDP图像格式的支持。
更新
echo $_SERVER['PATH'];
从Windows上的PHP:
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
目录:
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
echo $_SERVER['PATH'];
从Linux上的PHP:
/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图像格式的支持?
好消息! Imagick支持JXR或JPEG扩展范围格式,但不是您想要的格式。 您目前如何尝试访问它是通过使用一个字节数组。 Magick.NET(Imagick .NET库)的维护者在Github的一个封闭的问题中陈述如下:
格式是支持的,但你需要做一些“magick”,使其工作。 只有在将JXRDecApp.exe文件复制到bin目录并从具有.jxr扩展名的磁盘上的文件读取时,才能读取JXR文件。 从字节数组中读取不支持。 如果jxrlib项目( http://jxrlib.codeplex.com )的代码可能是ImageMagick的一部分,那将会很好。 也许我应该在ImageMagick项目中为此创建一个问题。 您将需要自己编译JXRDecApp.exe,因为没有可用的二进制文件。
所以JXR格式是支持的,但不是以你想要的方式应用它。 然而,转换可以通过命令行来完成,就像这里的 StackOverflow所描述的一样,或者像这样。
convert input.jpg jxr:output.jpg
剩下的就是编写一个执行这个命令的脚本来为你做转换。 确保你正确地保护那个脚本,并且它是输入和输出。 祝你好运!
资源:
一些PHP软件包带有自己的Imagick软件包,而不是使用系统软件包。 然后,您可能会发现命令行支持的内容和PHP支持的内容有所不同。
在源代码中,PHP直接从Imagick本身获取支持的格式列表。
如果它不是不同的版本,那么可能有一些隐藏的抽象,其中jxr是具有一些特定选项的另一个父格式的别名。