脸书最近正式宣布开源发布跨平台图片转码函数库Spectrum,现在已经在GitHub平台上提供Spectrum 1.0.0版本,随着智能手机相机硬件的快速进展,手机存储越来越多文件,这些庞大的数据文件会占据手机的存储空间,访问数据的速度也会变得相当缓慢,为了让发送图片的过程变得更有效率,脸书为Android和iOS系统,开发了图片转码函数库Spectrum,让移动设备的开发人员处理图片的工作,变得更简单、有效率。
第一步骤是在图片上传之前,通过转换编码格式来降低文件大小,虽然听起来简单,但是需要深入了解不同的图片处理步骤和图片格式,才能在不影响图片品质的情况下,降低文件的大小,利用平台提供的图片处理API,是一种解法,不过,多种移动平台和API,可能会产生多种不同输出结果,为了能够符合各种平台开发隐藏的细节和参数,脸书认为应该要能够优化输出结果。
现代的智能手机能够拍下高画质的图片,也因此,图片的文件通常很大,发送完整分辨率的照片通常是浪费,因为内容传递网络(content delivery network )也会为接收照片端重新调整大小,若能在发送端就先调整图像大小,就能减少发送照片的带宽,而挑战在于如何维持图片分辨率,又能降低图像大小。
在一般的图片处理任务中,像是直译可交换图像文件格式(EXIF)原数据,可能会导致重复性程序代码,让维护和全面性改善工作变得难以实行,而若使用最新的压缩函数库,像是MozJpeg,则需要撰写C语言或是C++语言,脸书想要打造的是,不需要写定制化或是难以维护的解决方案,让开发人员在维护图片品质的同时,能够简单地发送一个较小的文件。
图片转码函数库Spectrum的API,能够使开发人员聚焦于输出结果的属性,而不是每一个独立的步骤,且Spectrum能够选出实现转码请求的最佳方法,举例来说,若是可行,Spectrum会为选择裁切或是旋转JPEG图片,来完成图片失真率最低的操作,另外,Spectrum也会通过优化解码样本和完美像素(pixel-perfect)相互关系,来改变文件大小。
Spectrum针对不同的图片,提供图片转码的最佳配方(Recipes),协助开发人员,针对每个独立的请求,选择最佳的执行图片转码的方法步骤,Spectrum收到每个请求时,会反复执行配方的清单,迭代直到找到第一个最佳、最有效率且图片失真率最低的配方,也有可以处理任何转码请求的通用的配方,除此之外,脸书也将一些原本的压缩函数库集成至Spectrum,像是MozJpeg、Libpng和Libwebp,提升Spectrum对一般平台API编码参数的控制,这些组件能够为图片格式和额外的配方提供协助。
图片转码函数库Spectrum的核心是用C++语言所撰写,让Spectrum能够在Android和iOS系统的App中共享,使得输出的结果更加一致,为了使开发更容易,脸书也提供支持Java和Objective-C的API,除此之外,用C++写的核心也让Spectrum的配置更容易掌控,面对计算密集度较高的操作,也能展现较高的执行速度。
脸书期望借由开源发布图片转码函数库Spectrum,能够帮助开发人员创造出提供更好使用体验的图片产品,在脸书自家的App中,Spectrum函数库改善了图片传输的品质和可靠性。