Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/241.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的Imagick PNG压缩_Php_Compression_Imagick - Fatal编程技术网

PHP中的Imagick PNG压缩

PHP中的Imagick PNG压缩,php,compression,imagick,Php,Compression,Imagick,我一直在搜索stackoverflow以及PHP/Imagick文档,以使其正常工作。我的服务器上存储了PNG图像,然后这些图像会返回到我的iOS应用程序。我需要将它们作为大小调整和剪切的图像返回,所以我使用Imagick。迄今为止,我已: $image_name = $_POST['filepath']; if(!file_exists($image_name)){ return ""; } header("Content-Type: image/png"); $image = new Im

我一直在搜索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,我尝试了这里列出的每一个压缩常量:,因为对于PNG没有特定的压缩常量,但它们似乎都不会改变文件大小。(是否有一个特定的用于PNG?)我也更改了setImagesCompressionQuality中的值,但这些更改似乎都没有任何区别。我看到有些人从来没能让Imagick工作过,而另一些人却一直在工作,希望得到一个更新的答案。感谢您的帮助

功能是设置PNG图像的压缩级别。由于PNG是一种无损图像格式,因此它不会影响实际的图像质量(与JPEG图像一样),而只是告诉库压缩图像时的工作量和使用的策略。下面的代码将遍历所有可能的选项

我还尝试使用命令行:
pngcrush-brute Original.png pngcrushBrute.png
,看看可以节省多少空间

  • Original.png:192382字节-无需设置任何特定压缩级别
  • FullColor92.png:181832字节-所有可能选项的最佳输出
  • pngcrushBrute.png:178129字节-这可能更多地是因为删除了额外的头,而不是更好的压缩

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

Original.jpg:27626字节\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";
    }
}
//10的数字:
//
//0或省略:对
//zlib默认压缩级别
//
//1-9:zlib压缩级别
//
//1的数字:
//
//0-4:PNG过滤方法
//
//5:压缩级别>5时的libpng自适应过滤
//如果压缩级别为setImageFormat('png'),则libpng过滤器类型为“无”;
$imagick->writeimage(“./output/original.png”);
压缩类型($imagick,“./output/FullColor”);
函数compressAllTypes(Imagick$Imagick,$filename){
对于($compression=0;$compression-setOption('png:format','png8');
$compressionType=intval($compression.$filter);
$output->setImageCompressionQuality($compressionType);
$outputName=$filename.“$compression$filter.png”;
$output->writeImage($outputName);
}
回音“\n”;
}
}

这有什么帮助吗:@Danack我已经尝试过使用各种压缩质量-似乎没有改变文件大小-我还添加了$output->stripImage();出于某种原因,这给了我101个完全相同的文件,看起来它实际上也没有压缩任何东西:/me-除了100个文件副本比原始文件大之外(一个“原始”png截图)。@ashleedawg图像可能已经优化了……但也可能是一个bug。请尝试使用pngcrush或在线png优化工具。如果这些工具能够更好地压缩png,请您在上打开一个问题,我会仔细查看。