Я пытаюсь использовать imagemagick из командной строки (в php, да, я знаю, что могу использовать функции imagemagick, но это не вариант) без сохранения в окончательный файл и просто чтения окончательного изображения в стандартный вывод. вот мой код:
$filename = <filepathandname>;
$cmd = IMCMD. $filename . " -resize 105% -";
header('Content-Disposition: inline; filename="'.$filename.'"');
header('Content-Type: application/octet-stream');
header('Content-Length: '.filesize($filename));
header('Content-Type: image/jpeg');
//from here to end returns an empty image
ob_start();
passthru($cmd, $result);
$out = ob_get_contents();
ob_end_clean();
echo ($out);
//end
//readfile($filename); //otherwise this works fine
exit();
Я получаю пустое изображение (0 байт). Я пробовал множество других комбинаций из вопросов на этом сайте, например, просто повторяя STDOUT и т. Д., Но я думаю, что настоящая проблема заключается в том, что я не совсем понимаю, как convert.exe отправляет stdout, и вообще обрабатывал stdout.
какие-нибудь эксперты php / convert.exe там видят что-нибудь очевидное здесь?
Несколько вещей, которые должны помочь …
Во-первых, вы не показываете действующую команду ImageMagick, которую вы выполняете — это поможет людям!
Во-вторых, вам нужно пробел перед именем файла при создании $cmd
,
В-третьих, вы сообщаете браузеру размер файла прежде чем увеличить его размер на 5%, поэтому следует ожидать, что нижняя часть вашего изображения будет иногда обрезана!
В-четвертых, вы говорите браузеру, что файл Content-Type: image/jpeg
когда на самом деле это только тот же формат, что и входной файл, который может быть PNG
или же GIF
, например. Если вы не собираетесь проверять тип входного файла и установить Content-Type
соответственно, вы должны изменить свой ImageMagick
команда для записи jpg:-
скорее, чем -
в конце, чтобы заставить его выводить JPEG
вместо того, чтобы просто отражать тип входного файла, как вы делаете сейчас.
В-пятых, ваше изображение отображается правильно, за исключением того, что в начале файла есть новая строка — я не знаю, почему это так — возможно, это как-то связано с echo
, Я изменил ваш код, чтобы просто написать $out
без заголовков и перенаправил вывод в файл, затем я сделал это, чтобы вырезать первый байт:
phptest > x.jpg
dd if=x.jpg bs=1 iseek=1 > y.jpg
и полученный файл y.jpg
было правильно.
Других решений пока нет …