簡體   English   中英

想象一下PHP中的PNG壓縮

[英]Imagick PNG compression in PHP

我一直在搜索stackoverflow以及PHP / Imagick文檔,以使其工作。 我的PNG圖像存儲在我的服務器上,然后返回到我的iOS應用程序。 我需要將它們作為調整大小和裁剪的圖像返回,所以我使用的是Imagick。 因此,到目前為止,我有:

$image_name = $_POST['filepath'];
if(!file_exists($image_name)){ return ""; }
header("Content-Type: image/png");

$image = new Imagick($image_name);
$image->resizeImage($_POST['width'], $_POST['height'], Imagick::FILTER_LANCZOS, 1);
$image->roundCorners($_POST['width'], $_POST['height']);
$image->setImageFormat("png");
$image->setImageCompression(\Imagick::COMPRESSION_UNDEFINED);
$image->setImageCompressionQuality(0);
$image->stripImage();
echo $image;

對於setImageCompression,我已經嘗試了這里列出的每個壓縮常量: http//php.net/manual/en/imagick.constants.php ,因為沒有特定的PNG,但它們似乎都沒有改變文件大小。 (是否有一個特定的用於PNG?)我也改變了setImagesCompressionQuality中的值,但這些變化似乎也沒有任何區別。 我已經看到有些人從來沒有能夠讓Imagick工作,而其他人則是,並希望得到更新的答案。 任何幫助贊賞!

函數setImageCompressionQuality用於設置為PNG圖像完成的壓縮級別。 由於PNG是一種無損圖像格式,因此不會影響實際圖像質量(就像它對JPEG圖像一樣),而只是告訴圖書館在壓縮圖像時需要多少努力以及使用哪種策略。 下面的代碼貫穿所有可能的選項。

我也試過pngcrush使用命令行: pngcrush -brute Original.png pngcrushBrute.png看到更多的空間如何才能得救。

  • Original.png:192,382字節 - 不設置任何特定的壓縮級別
  • FullColor92.png:181,832字節 - 所有可能選項的最佳輸出。
  • pngcrushBrute.png:178,129字節 - 這可能更多是由於刪除額外的標頭而不是更好的壓縮。

    $ imagick-> setImageFormat( 'JPG'); $ imagick-> setImageCompressionQuality(80);

Original.jpg:27,626字節\\ o /

總結一下:

  • Imagick / ImageMagick已經接近使用默認設置的最佳壓縮。
  • 如果你需要獲得最好的壓縮,那么使用PngCrush會比Imagick提供更好的結果。
  • 如果圖像是照片,請將其作為jpg使用。 它是一個圖表/必須與png一起提供,你可以嘗試減少顏色,這將提供良好的“壓縮”,但不適合照片,因為它看起來很糟糕。

使用的代碼:

//10's digit:
//
//        0 or omitted: Use Z_HUFFMAN_ONLY strategy with the
//           zlib default compression level
//
//        1-9: the zlib compression level
//
//     1's digit:
//
//        0-4: the PNG filter method
//
//        5:   libpng adaptive filtering if compression level > 5
//             libpng filter type "none" if compression level <= 5
//or if image is grayscale or palette
//
//        6:   libpng adaptive filtering
//
//        7:   "LOCO" filtering (intrapixel differing) if writing
//a MNG, otherwise "none".  Did not work in IM-6.7.0-9
//and earlier because of a missing "else".
//
//8:   Z_RLE strategy (or Z_HUFFMAN_ONLY if quality < 10), adaptive
//             filtering. Unused prior to IM-6.7.0-10, was same as 6
//
//        9:   Z_RLE strategy (or Z_HUFFMAN_ONLY if quality < 10), no PNG filters
//             Unused prior to IM-6.7.0-10, was same as 6

$imagick = new Imagick("./Biter_500.jpg");

$imagick->setImageFormat('png');

$imagick->writeimage("./output/original.png");
compressAllTypes($imagick, "./output/FullColor");


function compressAllTypes(Imagick $imagick, $filename) {
    for ($compression = 0; $compression <= 9; $compression++) {
        echo "Compression $compression \n";
        for ($filter = 0; $filter <= 9; $filter++) {
            echo "Filter $filter";
            $output = clone $imagick;
            $output->setImageFormat('png');
            //$output->setOption('png:format', 'png8');
            $compressionType = intval($compression . $filter);
            $output->setImageCompressionQuality($compressionType);
            $outputName = $filename."$compression$filter.png";
            $output->writeImage($outputName);
        }
        echo "\n";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM