Сохранение изображения с помощью shell_exec() - с использованием imagejpeg & jpegoptim, с помощью stdin / stdinout

Я сохраняю изображение дважды, один раз, когда создаю его с помощью imagejpeg, а затем сжимаю и перезаписываю с помощью jpegoptim. Как я могу сделать это одним махом, чтобы я не сохранял изображение дважды?

$im = imagecreatefromstring($imageString);
imagejpeg($im, 'img/test.jpg', 100);
shell_exec("jpegoptim img/test.jpg");

У Jpegoptim есть stdin и stdout, но я изо всех сил пытаюсь понять, как их использовать.

Я хочу сохранить изображение с помощью оболочки, поэтому я представляю что-то вроде этого:

imagejpeg($im);
shell_exec("jpegoptim --stdin > img/test.jpg");

Но, увы, это не работает так, как я себе представлял.

1 ответ

Решение

Хотя это может и не работать лучше, это решение, которое записывает на диск только конечный результат:

// I'm not sure about that, as I don't have jpegoptim installed 
$cmd = "jpegoptim --stdin > img/test.jpg";
// Use output buffer to save the output of imagejpeg
ob_start(); 
imagejpeg($img, NULL, 100); 
imagedestroy($img); 
$img = ob_get_clean();
// $img now contains the binary data of the jpeg image
// start jpegoptim and get a handle to stdin 
$handle = popen($cmd, 'w');
// write the image to stdin
fwrite($handle, $img."\n");

Не забудьте потом закрыть все дескрипторы, если ваш скрипт продолжает работать.

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