QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

Facebook 移动端照片预览背后的技术

  • 2015-08-14
  • 本文字数:1578 字

    阅读完需:约 5 分钟

当在 Facebook 移动端上浏览某个人的用户资料或页面时,首先看到的往往是图片。这些图片是构成 Facebook 体验不可缺少的一部分,但有时候,图片的下载与展示非常慢,在低速或移动网络中尤其如此。而在像印度这样的发展中国家市场上,许多 Facebook 新用户主要是使用 2G 网络。近日,Facebook 工程师 Brian K Cabral Edward Kandrot 撰文描述了Facebook 解决这一问题的过程。

封面照片是屏幕上最显眼的部分,但它也是加载最慢的部分之一。这主要有两个原因:一是封面照片的大小常常达到100KB,而2G 连接的传输速度可能只有32KB/ 秒;二是应用程序需要发送两个网络请求才能显示封面照片。它首先向 GraphQL 服务器发送请求,获得照片 URL,然后发送第二个网络请求,使用该 URL 从 CDN 获取照片。第二个网络请求的延迟相当长,比第一个长许多。

为了解决上述问题,他们希望能够由原照片生成一张 200 字节大小的效果图,然后将其作为 GraphQL 响应的一部分在第一次请求应答中直接返回,这样可以省掉第二次请求,极大地缩短用户资料和页首的显示延迟。当然,他们最终还是要从 CDN 下载完整照片并进行展示,但这可以在后台进行。至此,问题变成如何将照片压缩成 200 字节。

他们希望照片的效果图有一种磨砂玻璃的效果。这既有趣,又能与原始照片保持一致。磨砂玻璃效果采用高斯滤波器比较容易实现,而且图片越模糊,分辨率就越低,图片的尺寸就越小。不过,为了提供良好的用户体验,分辨率也不能太低。通过多次尝试,他们得出,42x42 的图片可以达到他们想要的效果,而分辨率再高一些并不会带来更好的效果。但是,即使只显示图片的DC 分量,每个像素仍然需要3 个字节,那么42x42x3 就是5292 字节,远远超出200 字节的目标。

他们开始评估标准的压缩技术,试图找出一种最好的方法,将数据压缩至200 字节。遗憾的是,只是对图片进行熵编码(比如 zlib )的话,只能将图片压缩一半,仍然太大。他们还评估了其它若干非标准技术,但最终,他们决定试一下 JPEG 图像编码。遗憾的是,JPEG 头本身就有几百个字节的大小。不过,去掉 JPEG 头,编码的数据有效负荷接近 200 字节。

于是,他们开始探索,JPEG 图片是否有可能使用一个固定的头,那样就可以将其存储在客户端,而不需要传输。JPEG 头包含多个表。在 Q 值一定的情况下,量化表是不变的。通过试验,他们发现,Q20 生成的图片可以满足他们的要求。虽然他们的图片不是固定尺寸,但基本上都限制在 42x42 以下。他们还仔细查看了 JPEG 头中的其它内容,发现只有 Huffman 表会随着图片的不同发生变化。Q 值、图片数据及图片尺寸决定着 Huffman 表中的频率值,每一项变化都会导致不同的压缩比和有效负荷字节数。他们在一组图片上进行了试验,并最终找出了一个可以作为标准的 Huffman 表。

虽然他们处理了大量的图片,但总有一些该方案不适用的情况。为此,他们增加了一个版本号。如果发现任何极端情况,或者未来发现了更好的 Huffman 表,那么他们就可以更新相关图片的版本号,并将新表发送给客户端。最终的格式包含一个字节的版本号、一个字节的宽度、一个字节的高度和大约 200 字节的有效负荷。服务器只将这一格式作为 GraphQL 响应的一部分发送,然后由客户端将 JPEG 体附加到预定义的 JPEG 头上,生成一个普通的 JPEG 图片。经过标准的 JPEG 解码后,客户端可以运行预定的高斯模糊,并拉伸其尺寸以适应窗口大小。

最终,他们获得一种可以满足需求的格式。在网速缓慢的情况下,这帮助他们将用户资料和页面加载时间缩短了 30%。而在网速非常快的情况下,这可以确保用户立即看到封面照片预览,提升了整体体验。


感谢徐川对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

2015-08-14 08:398703
用户头像

发布了 1008 篇内容, 共 396.6 次阅读, 收获喜欢 345 次。

关注

评论

发布
暂无评论
发现更多内容

深入浅出 OkHttp 源码解析及应用实践

vivo互联网技术

okhttp 拦截器 源代码

Java性能分析工具JProfiler注册码下载

Rose

JProfiler激活码 JProfiler Mac永久激活版 Java 分析器 JProfiler中文版 JProfiler下载

DevEco Studio 3.1 Release | 动态共享包开发,编译更快,包更小

HarmonyOS开发者

HarmonyOS

全靠这份阿里大佬的“Java进阶面试手册”收获蚂蚁offer

Java你猿哥

Java kafka Spring Boot Netty java面试

中央企业数字化转型专业委员会正式揭牌!

用友BIP

财务管理

苹果系统更新:MacOS 11-13.x(PKG系统安装包及IPSW固件)

Rose

mac系统 macOS 13 Ventura 苹果最新系统 苹果系统下载

VM虚拟机 v13.0.2激活版 for Mac许可秘钥

Rose

VMware Fusion Pro 13 VM虚拟机破解版 Mac虚拟机 VMware Fusion激活秘钥

上海丨阿里云 Serverless 技术实战营邀你来玩!

Serverless Devs

阿里云 Serverless 中间件

如何进行测试分析与设计-HTSM启发式测试策略模型 | 京东云技术团队

京东科技开发者

测试 测试策略 企业号 5 月 PK 榜 HTSM

常用的表格检测识别方法 - 表格区域检测方法(下)

合合技术团队

人工智能 文字识别 表格识别 表格检测

旭阳数字郗维宝:数智化转型助力焦化企业打破行业困境

用友BIP

升级企业数智化底座 2023用友技术大会

Photoshop 2023 如何切换语言?

Rose

Photoshop 2023下载 如何切换PS语言 PS 2023破解

阿里云AnalyticDB(ADB) + LLM:构建AIGC时代下企业专属ChatBot

科技热闻

什么是研发 Lead Time?我悟了!

LigaAI

DevOps 敏捷开发 研发速率 研发效能管理 企业号 5 月 PK 榜

【GPT-4理论篇-1】GPT-4核心技术探秘 | 京东云技术团队

京东科技开发者

人工智能 openai GPT-4 企业号 5 月 PK 榜

CDN网关超大range计算方法

天翼云开发者社区

CDN

【5.12-5.19】写作社区优秀技术博文一览

InfoQ写作社区官方

热门活动 优质创作周报

浅谈基于Shapley值的数据融合反欺骗数据判断相关

天翼云开发者社区

数据 Shapley

原型设计Axure RP 9中文授权码【Mac/win】

Rose

Axure RP 9汉化 Axure RP 9授权码 产品原型设计工具 axure rp9下载 axure rp9安装教程

Java面试题1000+附答案大全(合适各级Java开发人员)

采菊东篱下

Java

500行代码手写docker开篇-goland远程编译环境配置

蓝胖子的编程梦

Docker 容器 云原生 k8s 命名空间

【实践篇】教你玩转JWT认证---从一个优惠券聊起 | 京东云技术团队

京东科技开发者

分布式 JWT 企业号 5 月 PK 榜

RocketMQ你不得不了解的 Rebalance机制源码分析

Java你猿哥

Java 源码 RocketMQ ssm client

BATJ架构师首推!分布式事务原理与实战,出神入化

程序知音

Java 分布式 java架构 Java进阶 后端技术

打造绿色低碳存储方案,助推数据中心绿色长“存”

天翼云开发者社区

CIO

2023年互联网大厂高频Java面试题(附答案)整理总结

架构师之道

Java 面试

用好kafka,你不得不知的那些工具

JAVA旭阳

Java kafka

LED显示屏技术升级方向介绍

Dylan

技术 升级 LED显示屏

MobTech 秒验|助力预热618

MobTech袤博科技

「聊天机器人构建、智能文档问答」大模型应用开发实操课程来了

飞桨PaddlePaddle

AIGC Prompt

完整版来了!阿里Dubbo技术负责人准备的源码教程,很有大厂风格

Java你猿哥

Java 架构 dubbo ssm

Facebook移动端照片预览背后的技术_Meta_谢丽_InfoQ精选文章