我的 php 使用 Imagick 的图像服务器在裁剪/缩小后生成了更大的 png8 文件

My php image server using Imagick produces much larger png8 files after cropping / scaling down

我正在尝试设置一个简单的 PHP 图像服务器,以允许我为每个图像添加大文件,然后根据需要缩放和裁剪它们。对于我的测试文件,我从 2400 x 1200 大小的插画家通过 "save for web" 导出的 png8 文件开始,文件大小为 21.6KB。

当我使用 Imagick 的 cropThumbnailImage 函数将其缩小到 600 x 600 时,生成的文件为 62.1KB(小得多的图像大小的三倍)。从插画师时钟中保存的相同图像的 600 x 600 裁剪大约为 8.2KB。为了增加便利性,我可以接受适度的文件大小增加,但增加约 8 倍实在太多了。

保存文件时,我确保强制输出为 png8,因此它不会默认为无损 png 格式,但除此之外,我对如何解决它一无所知。

这是我的处理代码:

//create working image
$image = new Imagick( $this->orig_file );

// Set Compression
$image->setImageCompressionQuality( 9 );

//scale image to height
$image->cropThumbnailImage ( $this->w, $this->h );

// strip extra data
$image->stripImage();

// save file
$image->writeImage( 'png8:'.$this->output_file );

这是我的测试文件:

Original Full scale image outputted by illustrator.

Cropped 600 x 600 image generated by imagick.

[编辑:根据下面马克的建议,我添加了以下更改]

// replacing cropThumbnailImage with:
$image->resizeImage(0, $this->h, imagick::FILTER_TRIANGLE, 1);

// crop
$start = ($image->getImageWidth() / 2) - ($this->w / 2);
$image->cropimage($this->w, $this->h, $start, 0);

// reduce colors to 20
$image->quantizeImage($this->q, 1, 0, true, false); // using 20 as $this->q

最终结果从 62.1KB 到 50.4KB,更好但仍然是全尺寸图像的两倍多,并且比插图画家保存的网络版本的那个尺寸大很多倍。

600x600 image reduced to 20 colors and resized not thumbnailed

您的原始图像有 33 种颜色,大小为 22kB。

如果您像这样调整大小(尽管是在命令行中):

convert jabba.png -resize 600x600 -strip png8:result.png

输出文件将为 6.6kB。

如果您按照我建议的 -scale 调整大小:

convert jabba.png -scale 600x600 -strip png8:result.png

输出文件将为 5.0kB。

如果您在其中保留 -quality 9,您最终会得到 > 25kB。