webp图片生成

ubuntu系统安装cwebp支持

1
apt-get install libmagickwand-dev libmagickcore-dev webp -y

使用 webp-tools 实现 webp与png、jpg 之间的格式转换

  • cwebp → WebP encoder tool
  • dwebp → WebP decoder tool
  • vwebp → WebP file viewer
  • webpmux → WebP muxing tool
  • gif2webp → Tool for converting GIF images to WebP
1
2
3
4
5
# convert from webp to png
dwebp mycat.jpg -o mycat.png

# Convert from JPG to WebP
cwebp some.jpg -o target.webp

cwebp 常用参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
-h, -help :显示帮助信息(简单版)。
-H, -longhelp :显示帮助信息(详细版)。
-q <float> :品质参数(0:最小,100:最优),缺省值为 75。
-alpha_q <int> :为 alpha 压缩指定一个 0 到 100 的数值。alpha 无损压缩用 100,小于 100 将产生有损压缩。默认值100。
-preset <string> :指定一组预定义的值用来区分不同的文件材料。可能的值有 default、photo、picture、drawing、icon、text。由于 -preset 覆盖其他参数的值(除了 -q),这个值最好出现在所有参数最前面。
-z <int> :切换无损压缩模式级别从 0 到 9,0 最快,9 最慢。速度越快文件越大。比较好的默认值是 6。这个参数是一个预定义压缩质量快捷阐述。如果参数 -q 或者 -m 被随后用到,这个 -z 就无效了。
-m <int> :制定压缩模式。这个参数控制了编码的速度,压缩文件大小,质量。值范围为 0 到 6,默认 4。值越大,花费时间越大用来检查额外的编码能力和质量。小的值会产生快的压缩速度,大的文件和低的压缩质量。
-segments <int> :更改在 sns 算法分段期间要使用的分区数。段的范围应为 1 到 4,默认值为 4。除非使用 -low_memory,否则此选项对方法 3 及更高版本无效。
-size <int> :为输出文件指定一个目标大小(单位 bytes),压缩器将多次压缩以接近这个目标。如果 -size 和 -psnr 同时使用, 那么 -size 优先。
-psnr <float> :指定目标 PSNR(以 dB 为单位)以尝试达到压缩输出。 压缩程序将通过几次部分编码,以便尽可能接近此目标。 如果同时使用 -size 和 -psnr,则以 -size 值为准。
-s <int> <int> :YUV 的输入大小(宽 x 高)。
-sns <int> :指定空间噪声整形的幅度(0:off,100:最大),缺省值为 50。
-f <int> :指定解过滤器的强度(0:off,100:最大),缺省值为 60。
-sharpness <int> :指定过滤的清晰度(0:最清晰,7:最不清晰),缺省值为 0。
-strong :使用强过滤替代简单过滤(默认开启强过滤)。
-nostrong :禁用强过滤,使用简单过滤。
-sharp_yuv :如果需要,请使用更准确,更清晰的 RGB-> YUV 转换。 请注意,此过程比默认的“快速” RGB-> YUV 转换要慢。
-partition_limit <int> :限制质量以适应第一个分区的 512k 限制(0:无降级,100:完全降级),缺省值为 0。
-pass <int> :设置选项 -size 或 -psnr 程序执行期间要使用的最大通过次数。参数范围 1 到 10,默认值为 1。如果使用选项 -size 或 -psnr,但未指定 -pass,则将使用默认值 6。
-crop <x> <y> <w> <h> :从左边顶部的点开始 (x_position, y_position) 计算来裁切图片。裁切区域必须在原文件图片区域内。
-resize <w> <h> :调整源文件的宽高。如果任意一个宽或者高的参数为 0,那么将按比例计算。
-mt :如果支持,采用多线程编码。
-low_memory :通过节省四倍于压缩大小(通常)来减少有损编码的内存使用。 这将使编码变慢,并且输出的大小和失真会稍有不同。
-map <int> :输出额外的 ASCII 映射编码信息。 可能的映射值范围是1到6。这仅是为了帮助调试。
-print_psnr :计算并报告平均 PSNR(峰值信噪比)。
-print_ssim :计算并报告平均 SSIM(结构相似性指标)。
-print_lsim :计算并报告局部相似性度量(像素邻居中的最低误差之和)。
-d <file.pgm> :转储压缩的输出(PGM 文件)。
-alpha_method <int> :指定用于 alpha 压缩的算法:0 或 1。算法 0 表示无压缩,1 使用 WebP 无损格式进行压缩。 预设值为 1。
-alpha_filter <string> :指定 Alpha 平面的预测过滤方法。有效值:none、fast、best,默认为 fast。
-exact :将 RGB 值保留在透明区域中。默认为关闭,以帮助压缩。
-blend_alpha <hex> :将颜色与以十六进制写入的 RGB 值表示的背景颜色混合,例如 0xc0e0d0 代表红色=0xc0,绿色=0xe0,蓝色=0xd0。
-noalpha :使用此选项将丢弃 Alpha 通道。
-lossless :无损编码图片处理。意味着整个图片,包含透明区域、看不见的像素值(R/G/B 或 Y/U/V)都会被保存。
-near_lossless <int> :指定无损压缩级别对图片处理预处理(0..100=off),缺省值为 100。这个参数用来调整像素帮助图片的可压缩性,但是尽可能减少图片可见区域质量。
-hint <string> :指定有关输入图像类型的提示。可能的值为:photo、picture 或 graph。
-metadata <string> :逗号分隔的元数据列表,如果存在,则从输入复制到输出。有效值:all、none、exif、icc、xmp。默认为 none。
-short :仅出于测试目的打印简要信息(输出文件大小和 PSNR)。
-quiet :安静模式(不打印任何东西)。
-version :打印版本信息并退出。
-noasm :禁用所有装配优化。
-v :打印更多信息(特别是编码时间)。
-progress :报告编码进度(百分比)。

对当前目录下的图片jpg、png转换成webp

1
for F in *.jpg; do cwebp -q 100 -preset photo $F -o `basename ${F%.jpg}`.webp; done

php对webp的支持配置

常用2种支持,gd和imagick

用docker方式和普通环境下都是一样的

gd库配置支持,需要单独编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 安装环境支持 
apt-get install -y libfreetype6-dev \
libjpeg62-turbo-dev \
libpng-dev \
libxpm-dev \
libwebp-dev \

#docker下安装扩展
#php5docker下gd库配置
docker-php-ext-configure gd \
--with-freetype-dir=/usr/include/ \
--with-jpeg-dir=/usr/include/ \
--with-xpm-dir=/usr/include/ \
--with-webp-dir=/usr/include/

docker-php-ext-install gd

#单一环境下安装
cd php-5.6.x/ext/gd
phpize
./configure --with-webp-dir=/usr/include/ \
--with-freetype-dir=/usr/include/ \
--with-jpeg-dir=/usr/include/ \
--with-png-dir=/usr/include/ \
--with-xpm-dir=/usr/include/

make

#添加扩展模块.ini
echo extension=gd.so > /usr/local/etc/php/docker-php-ext-gd.ini

#查看gd是否支持webp
php --ri gd

imagick扩展支持webp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# 系统源码安装imagick,系统自带不支持

# 下载老一些版本,保证稳定性
wget --no-check-certificate https://download.imagemagick.org/ImageMagick/download/releases/ImageMagick-6.9.12-49.tar.gz
tar zxvf ImageMagick-6.9.12-49.tar.gz
cd ImageMagick-6.9.12-49

#安装在/usr/local目录下,并开启webp支持
./configure --prefix=/usr/local --with-webp=yes
make && make install

#更新.so支持库
ldconfig /usr/local/lib

#查询编译的Imagick是否只是webp
convert -list format | grep webp

pecl channel-update pecl.php.net
pecl install imagick

#指定安装目录/usr/local

echo extension=imagick.so > /usr/local/etc/php/docker-php-ext-imagick.ini


#查看imagick支持
php --ri imagick |grep WEBP

#通过phpinfo查询
echo '<?php phpinfo(); ?>' | php 2>&1 |grep -i ssl

php代码中实现webp转换(imagick版本)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* Makes a webp.
*
* @param <type> $photo The photo
* @param string $width The width
* @param string $height The height
* @param string $quality The quality
*/
public function makeWebp($photo, $width = '', $height = '', $quality = '99')
{
$img_info = $this->getImgInfo($photo);
$photo = $this->images_dir . $photo; // 获得图片源
$webp_name = substr($img_info["name"], 0, strrpos($img_info["name"], ".")) . "." . "webp"; // 缩略图名称

if ($img_info["type"] == 1) {
$img = imagecreatefromgif($photo);
} elseif ($img_info["type"] == 2) {
$img = imagecreatefromjpeg($photo);
} elseif ($img_info["type"] == 3) {
$img = imagecreatefrompng($photo);
} else {
$img = "";
}

$thumb = new \Imagick();
$thumb->readImage($photo);
$thumb->setImageFormat("webp");
//设置地图质量
$thumb->setImageCompressionQuality($quality);
$thumb->writeImage($this->images_dir . $webp_name);
$thumb->clear();
$thumb->destroy();
}