PHP 中的 Imagemagick 特定 webp 调用
Imagemagick Specific webp calls in PHP
我能够为 imagemagick 安装 webp 支持。但是我缺少一些精确的命令。
基本内容包括:
$im = new Imagick();
$im->pingImage($src);
$im->readImage($src);
$im->resizeImage($width,$height,Imagick::FILTER_CATROM , 1,TRUE );
$im->setImageFormat( "webp" );
$im->writeImage($dest);
但我遗漏了许多微调选项,如 imageMagick 命令行文档中所述:
http://www.imagemagick.org/script/webp.php
具体来说:
如何设置压缩质量? (我尝试了 setImageCompressionQuality 但它不起作用,即输出总是相同的大小)
如何设置 "method"(从 0 到 6)?
谢谢
编辑:我遵循了@emcconville 下面的建议(谢谢!),但该方法和压缩均无效。于是我开始怀疑我编译的imagemagick。
我尝试使用命令行:
convert photo.jpg -resize 1170x1170\> -quality 50 photo.webp
Wehn 更改 50 质量变量,结果文件的大小始终相同。所以一定是我的imagemagick有问题...
How do I set the "method" (from 0 to 6)?
试试这个...
$im = new Imagick();
$im->pingImage($src);
$im->readImage($src);
$im->resizeImage($width,$height,Imagick::FILTER_CATROM , 1,TRUE );
$im->setImageFormat( "webp" );
$im->setOption('webp:method', '6');
$im->writeImage($dest);
How do I set compression quality? (I tried setImageCompressionQuality and it does not work, ie the output is always the same size)
Imagick::setImageCompressionQuality
seems to work for me, but note that webp:lossless
becomes enabled if the values is 100, or greater (see source)。您可以测试切换无损以查看它如何影响结果。
$img->setImageFormat('webp');
$img->setImageCompressionQuality(50);
$img->setOption('webp:lossless', 'true');
根据评论编辑
尝试使用 cwebp
实用程序直接测试图像到 webp 的转换。
cwebp -q 50 photo.jpg -o photo.webp
这还会将一些统计信息写入标准输出,这有助于调试正在发生的事情。
Saving file 'photo.webp'
File: photo.jpg
Dimension: 1170 x 1170
Output: 4562 bytes Y-U-V-All-PSNR 55.70 99.00 99.00 57.47 dB
block count: intra4: 91
intra16: 5385 (-> 98.34%)
skipped block: 5357 (97.83%)
bytes used: header: 86 (1.9%)
mode-partition: 2628 (57.6%)
Residuals bytes |segment 1|segment 2|segment 3|segment 4| total
macroblocks: | 0%| 0%| 0%| 98%| 5476
quantizer: | 45 | 45 | 43 | 33 |
filter level: | 14 | 63 | 8 | 5 |
另请记住,对于某些主题,调整压缩质量并不总能保证文件大小减小。但这些都是极端情况。
我能够为 imagemagick 安装 webp 支持。但是我缺少一些精确的命令。 基本内容包括:
$im = new Imagick();
$im->pingImage($src);
$im->readImage($src);
$im->resizeImage($width,$height,Imagick::FILTER_CATROM , 1,TRUE );
$im->setImageFormat( "webp" );
$im->writeImage($dest);
但我遗漏了许多微调选项,如 imageMagick 命令行文档中所述: http://www.imagemagick.org/script/webp.php
具体来说:
如何设置压缩质量? (我尝试了 setImageCompressionQuality 但它不起作用,即输出总是相同的大小)
如何设置 "method"(从 0 到 6)?
谢谢
编辑:我遵循了@emcconville 下面的建议(谢谢!),但该方法和压缩均无效。于是我开始怀疑我编译的imagemagick。 我尝试使用命令行:
convert photo.jpg -resize 1170x1170\> -quality 50 photo.webp
Wehn 更改 50 质量变量,结果文件的大小始终相同。所以一定是我的imagemagick有问题...
How do I set the "method" (from 0 to 6)?
试试这个...
$im = new Imagick();
$im->pingImage($src);
$im->readImage($src);
$im->resizeImage($width,$height,Imagick::FILTER_CATROM , 1,TRUE );
$im->setImageFormat( "webp" );
$im->setOption('webp:method', '6');
$im->writeImage($dest);
How do I set compression quality? (I tried setImageCompressionQuality and it does not work, ie the output is always the same size)
Imagick::setImageCompressionQuality
seems to work for me, but note that webp:lossless
becomes enabled if the values is 100, or greater (see source)。您可以测试切换无损以查看它如何影响结果。
$img->setImageFormat('webp');
$img->setImageCompressionQuality(50);
$img->setOption('webp:lossless', 'true');
根据评论编辑
尝试使用 cwebp
实用程序直接测试图像到 webp 的转换。
cwebp -q 50 photo.jpg -o photo.webp
这还会将一些统计信息写入标准输出,这有助于调试正在发生的事情。
Saving file 'photo.webp'
File: photo.jpg
Dimension: 1170 x 1170
Output: 4562 bytes Y-U-V-All-PSNR 55.70 99.00 99.00 57.47 dB
block count: intra4: 91
intra16: 5385 (-> 98.34%)
skipped block: 5357 (97.83%)
bytes used: header: 86 (1.9%)
mode-partition: 2628 (57.6%)
Residuals bytes |segment 1|segment 2|segment 3|segment 4| total
macroblocks: | 0%| 0%| 0%| 98%| 5476
quantizer: | 45 | 45 | 43 | 33 |
filter level: | 14 | 63 | 8 | 5 |
另请记住,对于某些主题,调整压缩质量并不总能保证文件大小减小。但这些都是极端情况。