pngquant с выводом PHP shell_exec в переменную

Я пытаюсь использовать pngquant с PHP, используя следующий код (источник):

<?phpfunction compress_png($path_to_png_file, $max_quality = 90)
{
if (!file_exists($path_to_png_file)) {
throw new Exception("File does not exist: $path_to_png_file");
}

// guarantee that quality won't be worse than that.
$min_quality = 60;

// '-' makes it use stdout, required to save to $compressed_png_content variable
// '<' makes it read from the given file path
// escapeshellarg() makes this safe to use with any path

// maybe with more memory ?
ini_set("memory_limit", "128M");

// The command should look like: pngquant --quality=60-90 - < "image-original.png"$comm = "pngquant --quality=$min_quality-$max_quality - < ".escapeshellarg(    $path_to_png_file);

$compressed_png_content = shell_exec($comm);

var_dump($compressed_png_content);

if (!$compressed_png_content) {
throw new Exception("Conversion to compressed PNG failed. Is pngquant 1.8+ installed on the server?");
}

return $compressed_png_content;
}

echo compress_png("image-original.png");

Функция должна извлекать выходные данные функции shell_exec. С выводом я должен быть в состоянии создать новый файл PNG, однако вывод shell_exec в браузере поврежден �PNG,

Замечания: выполнение команды успешно выполняется в консоли без PHP (pngquant --quality=60-90 - < "image-original.png")

Если я выполняю код php из консоли, я получаю следующее сообщение:

ошибка: не удалось записать изображение в стандартный вывод (16)

Я искал везде без какого-либо решения, кто-то может мне помочь или иметь представление о том, что может быть причиной проблемы?

1

Решение

Оболочка php-pngquant позволяет вы можете извлечь контент из сгенерированного изображения с помощью PNGQuant прямо в переменную используя метод getRawOutput:

<?php

use ourcodeworld\PNGQuant\PNGQuant;

$instance = new PNGQuant();

$result = $instance
->setImage("/image/to-compress.png")
->setQuality(50,80)
->getRawOutput();

// Result is an array with the following structure
// $result = array(
//    'statusCode' => 0,
//    'tempFile' => "/tmp/example-temporal.png",
//    'imageData' => [String] (use the imagecreatefromstring function to get the binary data)
//)

// Get the binary data of the image
$imageData = imagecreatefromstring($result["imageData"]);

// Save the PNG Image from the raw data into a file or do whatever you want.
imagepng($imageData , '/result_image.png');

Под капотом оболочка предоставляет в качестве выходного аргумента в PNGQuant временный файл, затем pngquant запишет сжатое изображение в этот файл и получит его содержимое в массиве результатов. Вы все еще можете проверить код выхода PNGQuant с помощью statusCode индекс массива результатов.

0

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

Других решений пока нет …

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