Расширение Imagick PHP не работает для вывода изображения JPEG XR

У меня проблема с 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 доступны из любого каталога!

Результат phpinfo() в Linux:

Пакеты 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?

2 ответа

Хорошие новости! Формат расширенного диапазона JXR или JPEG поддерживается Imagick, но не так, как вы этого хотите. В настоящее время вы пытаетесь получить к нему доступ с помощью байтового массива. Сопровождающий Magick.NET (библиотека Imagick .NET) в закрытом выпуске на Github сообщает следующее:

Формат поддерживается, но вам нужно будет сделать некоторую "магию", чтобы заставить его работать. Чтение файлов JXR будет работать только при копировании файла JXRDecApp.exe в каталог bin и чтении из файла на диске с расширением.jxr. Чтение из байтового массива не поддерживается. Было бы хорошо, если бы код проекта jxrlib ( http://jxrlib.codeplex.com/) мог быть частью ImageMagick. Возможно я должен создать проблему для этого в проекте ImageMagick. Вам нужно будет скомпилировать JXRDecApp.exe самостоятельно, потому что нет доступных двоичных файлов.

Таким образом, формат JXR поддерживается, но не так, как вы хотите его применить. Однако преобразование может быть выполнено через командную строку, как описано здесь в Stackru или как здесь.

convert input.jpg jxr:output.jpg

Осталось написать скрипт, который выполняет эту команду, чтобы выполнить преобразование за вас. Убедитесь, что вы правильно защищаете этот скрипт, его ввод и вывод. Удачи!

Источник:

Некоторые пакеты PHP поставляются с собственным пакетом Imagick, а не с системным пакетом. В результате вы можете найти то, что поддерживается в командной строке, и то, что поддерживает PHP, отличается.

В исходном коде PHP напрямую получает список поддерживаемых форматов от самого Imagick.

Если это не разные версии, возможно, есть какая-то скрытая абстракция, где jxr является псевдонимом для другого родительского формата с некоторыми конкретными параметрами.

Другие вопросы по тегам