Webp Introduction
What is Webp?
Webp是一种图像格式,支持单张图片,动图; 什么平台支持? 如何使用?
Open-Source projects
libwebp: https://chromium.googlesource.com/webm/libwebp
mirror: https://github.com/webmproject/libwebp/
User Guide
Options
- q: 指定quality factor
- alpha_q: 指定透明通道的压缩率
- preset: 指定图片的type
- -z: 指定lossless压缩的效率
- m: 压缩的速度档次,0最快,6是最慢
- segment: 指定要使用的segments,默认是4
- -size: 指定目标size (in bytes)
- -psnr: 指定目标的PSNR
- -sns: spatial noise shaping, important
- -f: filter strength, default 60,是指loop filter的强度
- -sharpness: filter sharpness, 0: most sharp, 7: 最小sharp
- -strong: use strong filter
- -sharp_yuv: use sharper RGB->YUV的转换
- -partition_limit
- -pass: analysis pass number
- -qrange,指定最小和最大QP的范围
- -mt: 使用multi-threading
- -alpha_method: 指定透明通道压缩的方法
- -alpha_filter: predictive filtering for alpha plane
- -exact: preserve RGB value in transparent area; 也就是不修改完全透明区域的
- -noalpha: 丢掉alpha的特征
- -lossless: 无损压缩图像
- -near_lossless: use near-lossless image preprocessing
- -hint: 指定图片的特征或者提示;
- -af: using autoaf,指标是ssim
如何把其他图片转换成Webp?
JPG format YUVJ420: YUV420P with JPEG color-range" (i.e. pixels use 0-255 range instead of 16-235 range, where 0 instead of 16 is black, and 255 instead of 235 is white);
使用工具cwebp
,最简单的使用就是: cwebp input.png -q 80 -o output.webp
重要的参数
重要的参数包括-preset -sns -f -m
: -preset
: 用于指定content的类型,应该最先被设置,这样后续的设置就在这个基础上来修改; 编码器内部会根据preset
去调整sns_strength
, filter_sharpness
, filter_strength
和preprocessing
.
-f
: 对应的是编码器内部的in-loop filter的filter strength;
-m
: 用来指定编码速度,[0, 6],0最快,6最慢,default是4
-sns
: 用来打开一些visual optimization,主要用来调节bit allocation. 用来把easy part的bit分配给hard part。通常升高sns,会导致文件增大,质量变好;
sns
method >= 4: distortion会包括spectural distortion Distortion: 在method > 4的时候,会有distortion和spectral distortion 设置segment的时候,可以控制幅度。 控制uv_ac,越小的话,dq_uv_ac变大,和dq_uv_dc,越大,uv_dc boost的越多 It will set do_search_
how to calculate alpha: Do transform, collect coefficients stats, find last_none_zero and max_values; alpha = last_non_zero/max_value 1. 计算每个mb的alpha 原理: TX: 4x4 convert coefficients to bins,calculate the histogram of abs(level) max_value: 出现系数最多的系数的出现次数,越大,说明0系数的越多,说明能量越少 last_non_zero: 最后一个非零系数,越大,说明高频的能量越多, alpha = ALPHA_SCALE * last_non_+zero / max_value; best_alpha = MAX_ALPHA - (3 * best_alpha + best_uv_alpha + 2) >> 2 高能量: 1
2
3
4
5MBAnalyze:323 analyze mbx 0, mby 1
mode 0, last_nonzero_count 31, max_value 95
mode 1, last_nonzero_count 31, max_value 88
MBAnalyze:330 best_alpha 179
MBAnalyze:341 mbx 0, mby 1, alpha 57, uv_alpha 2551
2
3
4
5MBAnalyze:323 analyze mbx 0, mby 3
mode 0, last_nonzero_count 11, max_value 234
mode 1, last_nonzero_count 4, max_value 244
MBAnalyze:330 best_alpha 23
MBAnalyze:341 mbx 0, mby 3, alpha 234, uv_alpha 16
filter params
Decoder perspective: 9.4 Loop Filter Type and Levels frame-level loop filter params: 1. filter_type: normal or simple, simple filter only applied to luma edges;
2. loop_filter_level: defines the threshold, if the different is below this threshold, it should be filtered, otherwise, it should not be changed. Usually the level correlated to quantizer levels.
3. sharpness_level, constant over the frame, 如果loop_filter_level=0,那么应该跳过loop_filter;
Differences in excess of a threshold(associated to the loop_filter_level) are assumed to not being modified.
mode_ref_lf_delta_update=1, allow per-macroblock adjustment, through delta; There are two types of delta values, one for reference frame-based adjustment, and the other group is for mode-based adjustment.
Filter header to write into bitstreams: simple: level: 对应fstrength_ sharpness
sharpness设置越大,fstrength越大; Q越大,fstrength越大;
fstrength是针对segment来的;
lf_delta
process; base_strength = F(q, sharpness) strength = 5 * filter_strength * base_strength / *(256 + beta_) level0 = fstrength_
只filter 4x4的块,不filter 16x16和skip的块;
How to decide the strength for each segments?
Why VP8StoreFilterStats? 存储不同的delta_q下,do filter之后的ssim并存储起来; How to decide final strength_; VP8AdjustFilterStrength
Internal Process
Speed 0/1
Speed 2~6
Alpha Encoding
主要通过一下几个接口来处理 1. VP8EncInitAlpha 2. VP8EncStartAlpha 3. VP8EncFinishAlpha 4. VP8EncDeleteAlpha
graph TD; A-->B; A-->C; B-->D; C-->D;
主要调用EncodeAlpha
进行处理 ## Feature ### Specify target_size/target_PSNR sns:
Region-based quantization
Adaptive Loop-filter
根据prediction mode或参考帧来决定loop filter strength Adjustment of loop-filter stregnth for each segment.
RDO
Preprocessing
sharp YUV
This is applied when converting RGB to YUV #### Smooth segment #### pseudo-random dithering log2 #### Alpha cleanup ### Lossless 主要通过调用WebPEncodeLosslessRGB,内部是调用EncodeLossless
. VP8LEncodeImage
is used to encoding lossless.
内部调用VP8LEncodeStream
QuantizeLevels VP8FiltersInit ApplyFiltersAndEncode EncodeAlphaInternal ---> EncodeLossless ---> VP8LEncodeStream ### Segment 不打开Segment情况下,
rd_opt_level: 1. no_rd 2. rd_opt_basic 3. rd_opt_trellis, perform trellis-quant on the final decision only 4. rd_opt_trellis_all
if rd_opt_level < rd_opt_basic>, then use VP8EncLoop
## Reference Official-Webp-Doc
React Native using Webp
Webp Tools
VP8 Encode Parameter Guide
VP8 Tech Overview
Webp Compression Techniques