为什么iPhone的图片质量比Android的好?

Android手机和iPhone有很多相比较的地方。我们无法做出哪个更好的结论,但是我们都知道Android手机图片的质量是比iPhone差的。无论你是用Facebook、Twitter甚至是Instagram,拍完照片,加个滤镜,然后分享到社交平台,Android手机产生的图片总是很粗糙。为什么呢?

从去年开始,我们的团队就这一点已经工作了一年。经过深入的研究,这是由于Google的一个“很小的”错误导致的。虽然是个很小的错误,但它的影响却是非常大的(所有的Android应用都涉及到图片),并且一直延续到了今天。

问题就是:libjpeg

我们都知道libjpeg是被广泛地应用到各种开源的图片库中。Android也使用libjpeg去压缩图片。在深入挖掘了Android的源码之后,我们可以发现相比于直接使用libjpeg库,Android是基于一个叫Skia的开源图片引擎。Skia是一个由谷歌维护的很棒的引擎,它涉及到了所有的图片功能。它被广泛地使用到谷歌和其他公司的产品中,比如Chrome、Firefox、Android等。Sika具有良好的封装性,在它的基础上,你可以很容易地开发图片工具。

当我们使用libjpeg去压缩图片时,optimize_coding 是一个非常重要的参数。在libjpeg的文档中,我们可以发现该参数的介绍如下:

boolean optimize_coding

    TRUE causes the compressor to compute optimal Huffman coding tables
    for the image.  This requires an extra pass over the data and
    therefore costs a good deal of space and time.  The default is
    FALSE, which tells the compressor to use the supplied or default
    Huffman tables.  In most cases optimal tables save only a few percent
    of file size compared to the default tables.  Note that when this is
    TRUE, you need not supply Huffman tables at all, and any you do
    supply will be overwritten.

来源: <https://github.com/bither/bither-android-lib/blob/master/REASON.md>

正如libjpeg的文档所示,我们不知道因为optimize_coding设置成了TRUE可能会花费很大的时间和空间,而optimize_coding 的默认值为FALSE。

文档中的所有内容看起来都是没问题的,而且libjpeg库也是非常稳定的。但是很多人忽视了一点,这个文档已经超过了10年。在那个时期,空间和计算能力都是非常有限的。在今天现代化的计算机甚至是手机上,这些都不是问题。相反,我们应该把更多的注意力放到图片的质量(Reitna 屏)和图片的大小(云服务)上来。

谷歌Skia项目的工程师并没有设置这个参数,所以Skia中的optimize_coding参数是保留FALSE作为默认值,并且Skia隐藏了该设置,你无法在Sika项目的外部去改变这个设置。所以这个就变成了很大的问题,我们也不得不去忍受糟糕的画质和更大的文件体积。

我们的团队已经测试了很多不同的图片。如果你想要同样质量的图片压缩,将optimize_coding设置为FALSE会比设置成TRUE的文件体积大5到10倍。这个差距是非常大的。

我们也比较了Android和iOS之间的图片压缩(他们都隐藏了optimize_coding参数)。在相同的原始图片下,如果你想获得相同的质量级别,在Android上你需要5到10倍的文件大小。

结论很清楚,Apple确实的知道optimize_coding和Huffman表的重要性,而Google不知道。(Apple使用它们自己的Huffman表算法,并不是像libjpeg或者libjpeg-turbo,看起来Apple在压缩图片上做了更多的工作)

最后,我们决定不使用Android提供的JPEG压缩算法,并且我们编译了基于libjpeg-turbo(libjpeg-turbo在表现上也有提高)的原生库。现在我们可以节省5到10倍的空间并且享受同样甚至更好的图片画质。这个工作是完全值得我们去做的。

感谢你的阅读。

来自为知笔记(Wiz)

时间: 2024-09-15 21:32:20

为什么iPhone的图片质量比Android的好?的相关文章

PHP判断iPhone、iPad、Android、PC设备的方法

因为工作需要我们需要知道是什么样了用户访问了我网站了,现在的移动设备种类多了,下面我们一起来看小编整理的一段php判断iPhone.iPad.Android.PC设备的例子. 注意:本代码的PC系统为Windows 原理是判断浏览器提交的USER AGENT <?php //获取USER AGENT $agent = strtolower($_SERVER['HTTP_USER_AGENT']); //做判断 $is_pc = (strpos($agent, 'windows nt')) ? t

针对iPhone的pt、Android的dp、HTML的css像素与dpr、设计尺寸和物理像素的浅分析

最近被一朋友问到:css中设置一DOM的height:65px,请问显示的高度是否和Android的65dp的元素等高?脑子里瞬间闪现了一堆的概念,如dpr,ppi,dp,pt等,然而想了一阵,浆糊了,所以重新梳理了相关的知识,以备不时之需. 1.ppi ppi指Pixels Per Inch也就是每英寸的像素点,此处的像素点就是物理像素点(也就是最小的显示单元). ppi描述的是像素的密度,满足以下公式 此图来源于uxabc(https://medium.com/uxabc/understan

利用PHP判断iPhone、iPad、Android、PC设备

首页那张大图确实是一个比较头疼的问题 在PC上显示是没问题的,可是到手机上就会超出页面一大截,如果做自适应,图片会被强制压缩 无奈只能用wp_is_mobile()函数在手机上隐藏了这张图,可是这函数似乎对iPad不管用 在iPad Air等高分辨率设备还好,在iPad2这类低分辨率设备上可就惨了 于是我决定自写一段代码解决这个问题 判断代码 我将使用Windows系统的设备定为PC,毕竟博客面向中国用户,大部分家用设备还是用的Windows系统 原理是判断浏览器提交的USER AGENT 1

有人在用iPhone的同时也在用Android吗?

不知道,锋友中,同时用两台手机的人有多少?在用两台手机的人中,你们是两台都是 iPhone,还是一台是 iPhone,另一台是 Android 手机?如果你们是左手 iPhone,右手 Android,那么这两台手机里,那一台是主要使用的,哪一台作为备用机型呢. 我们翻阅了各大国外科技论坛,发现在用着 iPhone 的同时,也使用 Android 手机的人也不少.我们来听听看,他们是如何各抒己见的. BobPepe : 我喜欢智能手机,几乎每上新一台,我都会买,我永远都在为“下一台手机”做准备.

js 判读是iPhone还是Android

<script style="text/javascript"> var browser = { versions: function () { var u = navigator.userAgent, app = navigator.appVersion; return { //移动终端浏览器版本信息 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端 android: u.indexOf('Android')

HTML5定稿了,终于有一种编程语言开发的程序可以在Android和IOS两种设备上运行了

2007 年 W3C (万维网联盟)立项 HTML5,直至 2014 年 10 月底,这个长达八年的规范终于正式封稿. 过去这些年,HTML5 颠覆了 PC 互联网的格局,优化了移动互联网的体验,接下来,HTML5 将颠覆原生 App 世界.这听起来有点危言耸听,但若认真分析 HTML5 的发展史,你会发现,这个世界的发展趋势确实就是这样. 熟知历史才能预知未来,先让我们来看看 HTML5 为什么诞生.这 8 年是怎么过来的. 一. HTML5 的诞生 自 W3C 于 1999 年发布 HTML

微信在浏览器打开前的提示页面Android与IOS判断

直接在网上扒一个页面,分分钟搞定!  先看一下效果 这是用微信开发工具打开的样式,直接上完整代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"/> <

H5 JS判断客户端是否是iOS或者Android手机移动端

<script type="text/javascript"> var u = navigator.userAgent; var isAndroid = u.indexOf('Android') > -1 || u.indexOf('Adr') > -1; //android终端 var isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端 alert('是否是Android:'+isAndroi

我的Android进阶之旅------&gt;HTTP Content-type 对照表

HTTP Content-type 对照表 文件扩展名 Content-Type(Mime-Type) 文件扩展名 Content-Type(Mime-Type) .*( 二进制流, 不知道下载文件类型) application/octet-stream .tif image/tiff .001 application/x-001 .301 application/x-301 .323 text/h323 .906 application/x-906 .907 drawing/907 .a11