1

サーバーへのアップロード中に pngquant を使用して画像 (jpeg および png) を圧縮しようとしています。pngquant Web サイトから取得したスクリプトは、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);
?>

jpegファイルにpngquantを使用できますか? または、phpを使用して私のubuntuサーバーでこれを行うために、jpegファイル(有料のjpegminiなど)を圧縮するためのより良い(無料の)ツールはありますか?

4

2 に答える 2

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 に答える