Facebook開源圖像處理庫Spectrum,優化移動端圖像生成

隨着移動照相硬件的迅速發展,我們的手機捕捉和存儲的文件越來越大。上傳這些大文件會消耗移動數據;它們可能需要很長時間才能加載;有時,文件根本無法加載。爲了使上傳過程更加高效,我們開發了一個適用於Android和iOS的圖像處理庫Spectrum。藉助Spectrum,我們提高了應用中大規模圖像上傳的可靠性和質量。我們最近在droidcon SF大會上將Spectrum作爲一個開源項目進行了展示,現在,我們在GitHub上正式發佈Spectrum 1.0.0

通向更好的移動圖像生成之路

第一步在上傳圖像之前開始。通過轉碼減少文件大小,可以快速減少數據消耗,提高上傳可靠性。這是一個簡單的解決方案,但是,要在保證質量的同時減小尺寸需要深入理解各種處理步驟和圖像格式。

使用平臺提供的圖像處理API是一種可能的解決方案。但是,大量的移動平臺和不斷髮展的API會產生不同的輸出。爲了服務於廣大開發人員,平臺隱藏了我們爲優化輸出而希望控制的細節和參數。通常,常見任務(如EXIF元數據解釋)會導致代碼重複,進而妨礙維護和全局改進。使用最新的壓縮庫,如MozJpeg,需要用C/C++編寫的原生代碼。我們想讓開發人員更容易發送較小的文件,同時保持對圖像質量的控制,而不需要編寫自定義的或難以維護的解決方案。

image
現代智能手機捕捉的圖像分辨率很高,大文件使得某些移動網絡上的上傳不可靠。以全分辨率發送通常是一種浪費,因爲內容傳遞網絡(CDN)無論如何都會調整接收方的圖像大小。

image
調整發送方設備上的圖像大小可以減少發送圖像所需的帶寬,最小化整個管道的負載開銷,改善端到端體驗。剩下的挑戰是如何在保持圖像質量的同時受益於較小的文件大小。

Spectrum:構建圖像處理基礎設施

對於移動開發人員來說,Spectrum使常見的圖像操作變得簡單、高效、一致。它的聲明性API允許開發人員關注所需的輸出屬性,而不是單個步驟。其次,這使得Spectrum可以透明地選擇最優的方式來滿足轉碼請求。例如,如果有機會,Spectrum會優先使用無損操作對JPEG圖像進行裁剪和旋轉。另一個例子是調整大小,Spectrum會優化解碼器採樣和像素級完美調整(pixel-perfect resizing)之間的相互作用。

“菜譜(Recipes)”幫助開發人員爲每個請求選擇最佳的執行順序。這些是由插件提供的。例如,JPEG插件將提供JPEG圖像無損裁剪和旋轉菜譜。所有菜譜都在內部聚合並排序,這樣,無損且高效的菜譜就位於頂部。對於每個請求,Spectrum將迭代列表並執行第一個匹配(因此是最有效)的菜譜。最後一個方法是一個通用菜譜,它可以通過解碼和編碼圖像來處理任何請求。

Spectrum的內核是用C++編寫的,可以在Android和iOS應用之間共享,這使得我們的輸出更加一致。它提供的JavaObjective-C API只是對這個內核的簡單包裝,目的是簡化開發。此外,C++內核提供了對內存分配的更多控制,通常會使計算密集型操作具有更高的執行速度。

與原生庫(如MozJpeg)的集成使得Spectrum可以控制通用平臺API之外的編碼參數。它使得開發人員可以利用計算密集型編碼,這需要更多的處理時間,但大大減少了文件大小。例如柵格量化和掃描優化。這在移動端是一個重要的權衡。在移動端,緩慢的網絡連接會影響上傳體驗。它還使我們能夠控制更高級的參數,如色度抽樣,利用邊緣銳化和插圖提高圖像質量。一致的API使得不是圖像專家的開發人員也能夠利用這些特性。

image
該庫的內核是用C++實現的。它將傳入請求與一組可以實現圖像操作的“菜譜”進行匹配。這裏會優先考慮更高效的無損操作。插件提供了對圖像格式和其他菜譜的支持。

我們希望Spectrum能像幫助Facebook實現更好的圖像生成體驗一樣,讓開發者受益。在我們的應用中,Spectrum提高了整個應用程序大規模圖像上傳的可靠性和質量。與基線編碼器相比,與Mozilla JPEG的默認集成使得上傳文件的大小減少了15%。我們很希望看到社區如何使用Spectrum 1.0.0庫來改善應用程序的照片體驗。

查看英文原文:Facebook open-sources Spectrum 1.0.0 for better mobile image production

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章