Linux — расширение PHP Imagick не работает для вывода изображения 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?

3

Решение

Хорошие новости! Формат расширенного диапазона 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

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

Источник:

0

Другие решения

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

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

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

-1

По вопросам рекламы [email protected]