前言
本文的主要内容是在 Rocky Linux 9 / CentOS Stream 9 下通过源代码编译安装 libwebp 库,以支持以后 Nginx 和 PHP 的 WebP 功能。
有个 现代的图片压缩格式叫做 WebP,它是由谷歌最先提出,并且完成的。
它比传统的图片压缩格式效率更高、压缩效果更好。并且, 支持透明和动画,以及提供有损和无损压缩的选项。
WebP 可结合 HTTP 服务器进行一定的配置就可对图片请求动态智能地返回 WebP 格式的响应。
有条件的情况下,我们都应应用它,代替旧的格式。
什么是 libwebp
libwebp 是一套集合 WebP 实用应用程序的库,安装了它可得到若干可对 WebP 图片格式进行操作的工具,如:
- libwebp:通过编程来对 WebP 格式的图片进行编码或解码。
- cwebp:WebP编码器。可对其他如PNG、JPEG等格式的图片转换为 WebP 格式。
- dwebp:WebP解码器。将 WebP 格式解码为PNG等格式,但不能解码动图。
- vwebp:WebP 文件查看器,但它在下文编译安装时不被包括在其中。
- webpmux:WebP 多路复用工具。
webpmux – 从非动画形式的 WebP 图片创建动画 WebP 文件,从动画 WebP 图片中提取帧,以及管理 XMP/EXIF 元数据和 ICC 配置文件。
gitf2webp:用于将 GIF 图片转换为 WebP 的工具。
以上参考:
https://developers.google.com/speed/webp/download?hl=zh-cn 。
https://developers.google.com/speed/webp/docs/webpmux?hl=zh-cn
安装前提
需要安装高版本的 libjpeg 库,以支持最新的 libwebp 和以后的 libgd。
至于 libjpeg-turbo 的安装,请参考:
Rocky Linux 9 源代码编译安装 libjpeg-turbo 。
安装依赖
dnf install -y wget autoconf automake libtool freetype-devel fontconfig \
libpng-devel libtiff-devel freetype-devel fontconfig-devel libpng libtiff
cat>/tmp/installer.sh<<EOF
cd /tmp
if [ ! -f "giflib-devel-5.2.1-9.el9.x86_64.rpm" ]; then
echo "+++++++++++++++++++++++++++++++++下载 giflib-devel RPM 安装包:"
# url=https://mirrors.ustc.edu.cn/rocky/9.3/devel/x86_64/os/Packages/g/giflib-devel-5.2.1-9.el9.x86_64.rpm
# https://rpmfind.net/linux/rpm2html/search.php?query=giflib-devel
url=https://rpmfind.net/linux/centos-stream/9-stream/CRB/x86_64/os/Packages/giflib-devel-5.2.1-9.el9.x86_64.rpm
wget --continue \$url
code=\$?
count=1
MAX_CNT=10
while [ \$code -gt 0 ]; do
if [ \$count -eq \$MAX_CNT ]; then
break
fi
count=\$((\$count + 1))
echo "+++++++++++++++++++++++++++++++++giflib-devel 安装包下载失败,现在重新下载:"
sleep 1
wget --continue \$url
code=\$?
done
if [ \$code -gt 0 ]; then
echo "+++++++++++++++++++++++++++++++++giflib-devel 安装包下载失败!"
exit
fi
fi
dnf install -y ./giflib-devel-5.2.1-9.el9.x86_64.rpm
if [ \$? -gt 0 ]; then
echo "+++++++++++++++++++++++++++++++++giflib-devel 安装失败!"
exit
else
echo "+++++++++++++++++++++++++++++++++giflib-devel 安装成功!"
echo "+++++++++++++++++++++++++++++++++删除 giflib-devel 安装包文件:"
rm -fv /tmp/giflib-devel-5.2.1-9.el9.x86_64.rpm
fi
EOF
bash /tmp/installer.sh
对安装好的依赖进行进一步的工作
if [ -f /usr/lib64/libgif.so ]; then
ln -sf /usr/lib64/libgif.so* /usr/local/lib64/
ln -sf /usr/lib64/libgif.so* /usr/local/lib/
fi
if [ -f /usr/lib64/libpng.so ]; then
ln -sf /usr/lib64/libpng* /usr/local/lib64/
ln -sf /usr/lib64/libpng* /usr/local/lib/
fi
echo "+++++++++++++++++++++++++++++++++检查 gif 和 png 的动态库文件:"
ldconfig -v |grep -iE "gif|png"
从网络上获取 libwebp 源码
如果因为网络问题不能下载源码包,那么请参考本站的其他文章: 如何在境内加速 GitHub 资源的下载以及克隆。
# https://storage.googleapis.com/downloads.webmproject.org/releases/webp/index.html
# LIBWEBP_VER="1.3.2"
export LIBWEBP_VER="1.5.0"
cat>/tmp/installer.sh<<EOF
cd /tmp
if [ ! -f "libwebp-\${LIBWEBP_VER}.tar.gz" ]; then
echo "+++++++++++++++++++++++++++++++++下载 LibWebP 源代码包:"
sleep 5
wget --continue https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-\${LIBWEBP_VER}.tar.gz
code=\$?
count=1
MAX_CNT=10
while [ \$code -gt 0 ]; do
if [ \$count -eq \$MAX_CNT ]; then
break
fi
count=\$((\$count + 1))
rm -f libwebp-\${LIBWEBP_VER}.tar.gz*
echo "+++++++++++++++++++++++++++++++++LibWebP 源代码包下载失败,现重新下载!"
sleep 1
wget --continue https://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-\${LIBWEBP_VER}.tar.gz
code=\$?
done
if [ \$code -gt 0 ]; then
echo "+++++++++++++++++++++++++++++++++LibWebP 源代码包下载失败!"
exit
fi
echo "+++++++++++++++++++++++++++++++++成功下载 LibWebP 源代码包!"
fi
if [ -d "libwebp-\${LIBWEBP_VER}" ]; then
rm -rf libwebp-\${LIBWEBP_VER}/
fi
if [ -d "libwebp" ]; then
rm -rf libwebp/
fi
EOF
bash /tmp/installer.sh
解压文件
cd /tmp
tar zxf libwebp-${LIBWEBP_VER}.tar.gz
# 得到 libwebp-1.5.0 目录
# 重命名,以后有用
mv libwebp-${LIBWEBP_VER} libwebp
cd libwebp
进行编译
cat>/tmp/installer.sh<<EOF
cd /tmp
cd libwebp
echo "+++++++++++++++++++++++++++++++++开始进行编译条件配置:"
./configure --enable-libwebpdecoder --enable-libwebpextras --enable-libwebpmux --enable-libwebpdemux --enable-gif
if [ \$? -gt 0 ]; then
echo "+++++++++++++++++++++++++++++++++LibWebP 编译条件配置失败!"
exit
fi
echo "+++++++++++++++++++++++++++++++++开始编译和安装 libwebp:"
sleep 5
make -j2 && make install
if [ \$? -gt 0 ]; then
echo "+++++++++++++++++++++++++++++++++libwebp 的编译或安装过程出错!编译失败!"
exit
fi
echo "+++++++++++++++++++++++++++++++++libwebp 成功编译安装!"
echo "+++++++++++++++++++++++++++++++++删除 libwebp 源代码:"
rm -rvf /tmp/libwebp*
if [ -f "/usr/lib64/libwebp.so.7" ]; then
ln -sf /usr/lib64/libwebp.so.7 /usr/lib64/libwebp.so
fi
echo "+++++++++++++++++++++++++++++++++确定 LibWebP 是否成功安装:"
ldconfig -v | grep webp
echo "+++++++++++++++++++++++++++++++++LibWebP 安装成功!"
EOF
bash /tmp/installer.sh
验证动态库版本
readelf -d /usr/lib64/libwebp.so
readelf -d /usr/lib64/libwebp.so.7
测试
# 将一张 JPEG 图片 test-origin.jpg 转换为 WebP 文件:
cwebp test-origin.jpg -o test.webp
转换好后把得到的 test.webp 文件下载到有桌面的电脑上查看是否已经转换成功。
用图形界面图像软件 ImageMagick 查看到此图片文件的格式是 WebP。
后记
本文展示了 LibWebP 通过源代码编译安装的全过程,过程中还安装了 libgif 和 libpng 相关的动态库,以解决 LibWebP 的安装依赖。
不仅如此,还以有序列表的形式介绍了 libwebp 的核心功能。
本文的脚本可以在 Rocky Linux 9 以及 CentOS Stream 9 下正确运行。
鉴于本人的相关知识储备以及能力有限,本博客的观点和描述如有错漏或是有考虑不周到的地方还请多多包涵,欢迎互相探讨,一起学习,共同进步。
本文章可以转载,但是需要说明来源出处!
本文使用的部分图片来源于网上,若是侵权,请与本文作者联系删除: admin@icxzl.com