У меня проблема с 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();
Результат phpinfo () в Windows:
Приложение для 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 ‘: нет такого файла или каталога @ warning / module.c / GetMagickModulePath / 830 в D: \ www \ temp jxr \ index.php в строке 11
Фатальная ошибка в Linux:
Невозможно установить формат изображения
Wiki ImageMagick:
Поддерживаемые форматы изображений:
JXR | RW | JPEG расширенный диапазон | Требуется jxrlib библиотека делегатов. Поместите приложения JxrDecApp и JxrEncApp в свой путь выполнения.
Узнайте больше это
ChangeLog:
2013-04-29 6.8.5-3 Кристи
Добавьте DeleteImageArtifact () для jpeg: артефакт экстента (спасибо Jimmy Xie @ Microsoft).
Добавить поддержку для формата изображения JXR / WDP.
Обновить
echo $_SERVER['PATH'];
из PHP на Windows:
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'];
из PHP на Linux:
/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?
Хорошие новости! Формат расширенного диапазона JXR или JPEG поддерживается Imagick, но не так, как вы этого хотите. В настоящее время вы пытаетесь получить к нему доступ посредством использования байтового массива. Сопровождающий Magick.NET (библиотека Imagick .NET) в закрытом выпуске на Github сообщает следующее:
Формат поддерживается, но вам нужно будет поработать над «магией». Чтение файлов JXR будет работать только тогда, когда вы копируете файл JXRDecApp.exe в каталог bin и читаете из файла на диске с расширением .jxr. Чтение из байтового массива не поддерживается. Было бы неплохо, если бы код проекта jxrlib (http://jxrlib.codeplex.com) может быть частью ImageMagick. Возможно я должен создать проблему для этого в проекте ImageMagick. Вам нужно будет скомпилировать JXRDecApp.exe самостоятельно, потому что нет доступных двоичных файлов.
Таким образом, формат JXR поддерживается, но не так, как вы хотите его применить. Однако преобразование можно выполнить через командную строку, как описано в StackOverflow. Вот или как это.
convert input.jpg jxr:output.jpg
Осталось написать скрипт, который выполняет эту команду, чтобы выполнить преобразование за вас. Убедитесь, что вы правильно защищаете этот скрипт и его ввод и вывод. Удачи!
Источник:
Некоторые пакеты PHP поставляются с собственным пакетом Imagick, а не с системным пакетом. В результате вы можете найти то, что поддерживается в командной строке, и то, что поддерживает PHP, отличается.
В исходном коде PHP напрямую получает список поддерживаемых форматов от самого Imagick.
Если это не разные версии, возможно, есть какая-то скрытая абстракция, где jxr является псевдонимом для другого родительского формата с некоторыми конкретными параметрами.