WebP图片格式iOS实例

前言

俗话说,谷歌大法好,WebP是由谷歌公司推出的图片文件格式,支持有损、无损压缩。从官方文档,可以看到如下图所示的对比,大意就是压缩率比PNG、JPEG等高。腾讯也对WebP做了测试,测试链接请戳这里。现在,很多公司都已经开始使用WebP格式,国内如腾讯、淘宝、今日头条等等。

iOS WebP 示例

iOS原生肯定是不支持WebP格式的,接下来,将介绍三种方法来展示在iOS端如何支持WebP格式:

编译源代码

从官网下载WebP库的源代码,下载地址请戳这里,下载如下图所示的部分,下载后是一个tar文件,名字类似于

libwebp-0.5.1.tar,创建一个build文件夹,将该压缩文件放到build目录,然后再创建一个build.sh的shell文件,该文件用来生成通用的framework,代码如下:

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
 #!/bin/sh
#
# Note: This build script assumes it can find the archive for libwebp
# in the current directory. You can download it from the following URL:
# http://code.google.com/speed/webp/download.html
#
# The resulting framework will can be found in the current directory
# with the name WebP.framework
#

SDK=9.3 #改成自己的SDK版本
PLATFORMS="iPhoneSimulator iPhoneSimulator-64 iPhoneOS-V7 iPhoneOS-V7s iPhoneOS-ARM64"
DEVELOPER=`xcode-select -print-path`
TOPDIR=`pwd`
BUILDDIR="$TOPDIR/tmp"
FINALDIR="$TOPDIR/WebP.framework"
LIBLIST=''
DEVROOT="${DEVELOPER}/Toolchains/XcodeDefault.xctoolchain"

mkdir -p $BUILDDIR
mkdir -p $FINALDIR
mkdir $FINALDIR/Headers/

for PLATFORM in ${PLATFORMS}
do
if [ "${PLATFORM}" == "iPhoneOS-V7" ]
then
SDKPATH="${DEVELOPER}/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/" #改成自己的SDK版本
ARCH="armv7"
HOST=${ARCH}-apple-darwin
elif [ "${PLATFORM}" == "iPhoneOS-V7s" ]
then
SDKPATH="${DEVELOPER}/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/" #改成自己的SDK版本
ARCH="armv7s"
HOST=${ARCH}-apple-darwin
elif [ "${PLATFORM}" == "iPhoneOS-ARM64" ]
then
SDKPATH="${DEVELOPER}/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS9.3.sdk/" #改成自己的SDK版本
ARCH="arm64"
HOST="aarch64-apple-darwin"
elif [ "${PLATFORM}" == "iPhoneSimulator-64" ]
then
SDKPATH="${DEVELOPER}/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.3.sdk/" #改成自己的SDK版本
ARCH="x86_64"
HOST=${ARCH}-apple-darwin
else
SDKPATH="${DEVELOPER}/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator9.3.sdk/" #改成自己的SDK版本
ARCH="i386"
HOST=${ARCH}-apple-darwin
fi

export CC=${DEVROOT}/usr/bin/cc
export LD=${DEVROOT}/usr/bin/ld
export CPP=${DEVROOT}/usr/bin/cpp
export CXX=${DEVROOT}/usr/bin/g++
export AR=${DEVROOT}/usr/bin/ar
export AS=${DEVROOT}/usr/bin/as
export NM=${DEVROOT}/usr/bin/nm
export CXXCPP=${DEVROOT}/usr/bin/cpp
export RANLIB=${DEVROOT}/usr/bin/ranlib

rm -rf libwebp-0.5.1 #根据自己的libwebp版本
tar xzf libwebp-0.5.1.tar
cd libwebp-0.5.1

sh autogen.sh

ROOTDIR="/tmp/install.$$.${ARCH}"
rm -rf "${ROOTDIR}"
mkdir -p "${ROOTDIR}"

export LDFLAGS="-arch ${ARCH} -miphoneos-version-min=7.0 -pipe -isysroot ${SDKPATH} -O3 -DNDEBUG"
export CFLAGS="-arch ${ARCH} -miphoneos-version-min=7.0 -pipe -isysroot ${SDKPATH} -O3 -DNDEBUG"
export CXXFLAGS="-arch ${ARCH} -miphoneos-version-min=7.0 -pipe -isysroot ${SDKPATH} -O3 -DNDEBUG"

./configure --host=${HOST} --prefix=${ROOTDIR} --disable-shared --enable-static \
--enable-libwebpdecoder --enable-swap-16bit-csp --build=$(./config.guess)
make
make install

LIBLIST="${LIBLIST} ${ROOTDIR}/lib/libwebp.a"
cp -Rp ${ROOTDIR}/include/webp/* $FINALDIR/Headers/

cd ..
done

${DEVROOT}/usr/bin/lipo -create $LIBLIST -output $FINALDIR/WebP

rm -rf libwebp-0.5.1
rm -rf ${BUILDDIR}

上面的代码需要注意的几个地方,就是SDKPathSDK变量需改成自己Xcode的SDK的版本号,因为我这个实例用的是libwebp-0.5.1版本,如果用的是其他的版本,则需要把脚本中的所有libwebp-0.5.1替换成你自己的版本名。一切妥当后,执行./build.sh命令,最后会生成一个WebP.framework框架,将其添加到自己的项目中,然后在Build SettingsFramework Search Paths中添加WebP.framework框架所在的目录路径即可。

直接使用官方编译好的framework

直接使用官方编译好的framework,下载地址请戳这里,下载如下如图所示的文件,下载完之后直接改名为WebP.framework,添加到项目中,同样,在Build SettingsFramework Search Paths中添加WebP.framework框架所在的目录路径即可。

项目示例请戳这里,欢迎Star。

SDWebImage

SDWebImage支持WebP格式,但是默认不开启,需要添加SubSpecs,具体步骤参看SDWebImage官方说明。