4

我有一个问题ImageMagick。我搜索了很多,但未能找到解决方案。我的问题与输出JPEG XR格式有关。我正在尝试在服务器上执行PHP 7.0/7.1此操作Windows 10Linux 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 上的结果 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': 没有这样的文件或目录 @warning/module.c/GetMagickModulePath/830 在 D:\www\temp\ jxr\index.php 在第 11 行

Linux 上的致命错误

无法设置图像格式

维基 ImageMagick:

支持的图像格式:

JXR | RW | JPEG 扩展范围 | 需要jxrlib委托库。将 JxrDecApp 和 JxrEncApp 应用程序放在您的执行路径中。 阅读更多

变更日志:

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 图像格式的支持?

4

2 回答 2

1

好消息!Imagick 支持 JXR 或 JPEG 扩展范围格式,但不是您想要的方式。您当前如何尝试访问它是通过使用字节数组。Magick.NET(Imagick .NET 库)的维护者在 Github 上的一个已关闭问题中声明如下:

该格式受支持,但您需要做一些“魔术”才能使其工作。仅当您将文件 JXRDecApp.exe 复制到您的 bin 目录并从磁盘上具有 .jxr 扩展名的文件中读取时,才能读取 JXR 文件。不支持从字节数组中读取。如果 jxrlib 项目 ( http://jxrlib.codeplex.com ) 的代码可以成为 ImageMagick 的一部分,那就太好了。也许我应该在 ImageMagick 项目中为此创建一个问题。您需要自己编译 JXRDecApp.exe,因为没有可用的二进制文件。

所以 JXR 格式是受支持的,但不是您想要应用它的方式。但是,转换可以通过命令行完成,如 StackOverflow 上所述或类似这样

convert input.jpg jxr:output.jpg

剩下的就是编写一个执行此命令的脚本来为您进行转换。确保正确保护该脚本及其输入和输出。祝你好运!

资源:

于 2017-11-22T07:46:32.713 回答
-1

一些 PHP 包带有自己的 Imagick 包,而不是使用系统包。然后,您可能会发现命令行支持的内容和 PHP 支持的内容有所不同。

在源代码中,PHP 直接从 Imagick 本身获取支持的格式列表。

如果不是不同的版本,那么可能存在一些隐藏的抽象,其中 jxr 是具有某些特定选项的另一种父格式的别名。

于 2017-11-24T13:42:09.220 回答