1

我正在尝试使用 pngquant 在上传到我的服务器时压缩图像(jpeg 和 png)。我从 pngquant 网站获得的脚本适用于 png 文件,但不适用于 jpeg 文件。我正在使用此代码(适用于 png 文件):

function 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
    $compressed_png_content = shell_exec("pngquant --quality=$min_quality-$max_quality - < ".escapeshellarg(    $path_to_png_file));

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

    return $compressed_png_content;
}

/****************************************************/


$download_url = "https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png";


    // maximum execution time in seconds
    set_time_limit (24 * 60 * 60);

    // folder to save downloaded files to. must end with slash
    $destination_folder = '/IMAGES/';

    $ImageName = "testing_pngquant_image3.png";
    $CompressedImageName = "testing_pngquant_image_compressed3.png";

    $url = $download_url;
    $newfname = $destination_folder . $ImageName;

    $file = fopen ($url, "rb");
    if ($file) {
      $newf = fopen ($newfname, "wb");

      if ($newf)
      while(!feof($file)) {
        fwrite($newf, fread($file, 1024 * 8 ), 1024 * 8 );
      }
    }

    if ($file) {
      fclose($file);
    }

    if ($newf) {
      fclose($newf);
    }



    $path_to_uncompressed_file = $newfname;
    $path_to_compressed_file = $destination_folder . $CompressedImageName;

// this will ensure that $path_to_compressed_file points to compressed file
// and avoid re-compressing if it's been done already
if (!file_exists($path_to_compressed_file)) {
    file_put_contents($path_to_compressed_file, compress_png($path_to_uncompressed_file));
}

// and now, for example, you can output the compressed file:
header("Content-Type: image/png");
header('Content-Length: '.filesize($path_to_compressed_file));
readfile($path_to_compressed_file);
?>

pngquant 完全可以用于 jpeg 文件吗?或者有没有更好的(免费)工具来压缩 jpeg 文件(如付费的 jpegmini)来使用 php 在我的 ubuntu 服务器上执行此操作。

4

2 回答 2

1

据我所知,Pngquant 用于以有损方式压缩 png 格式。对于 jpeg,您可以在输出时使用品质因数。

于 2017-09-06T12:05:36.470 回答
0

I'm pretty sure that pngquant is only for PNG files. There are a number of similar utilities for use on JPGs. You might want to consider just using the existing script imgopt (bash shell script). It is located here: imgopt

This script works well (both JPG and PNG) and is very easy to use. It is completely lossless so it is fairly safe, but you should be able to add pngquant in there if you want (pngquant is lossy). There are some required programs you need to install first, and one binary if you chose to use it (pngout).

I didn't write the script, I have just used it for quite a while.

于 2016-08-02T03:43:00.667 回答