Facebook 開源影象處理庫 Spectrum,優化移動端影象生成
隨著移動照相硬體的迅速發展,我們的手機捕捉和儲存的檔案越來越大。上傳這些大檔案會消耗移動資料;它們可能需要很長時間才能載入;有時,檔案根本無法載入。為了使上傳過程更加高效,我們開發了一個適用於 Android 和 iOS 的影象處理庫 Spectrum 。藉助 Spectrum,我們提高了應用中大規模影象上傳的可靠性和質量。我們最近在 droidcon SF 大會上將 Spectrum 作為一個開源專案進行了展示,現在,我們在 GitHub 上正式釋出 Spectrum 1.0.0 。
通向更好的移動影象生成之路
第一步在上傳影象之前開始。通過轉碼減少檔案大小,可以快速減少資料消耗,提高上傳可靠性。這是一個簡單的解決方案,但是,要在保證質量的同時減小尺寸需要深入理解各種處理步驟和影象格式。
使用平臺提供的影象處理 API 是一種可能的解決方案。但是,大量的移動平臺和不斷髮展的 API 會產生不同的輸出。為了服務於廣大開發人員,平臺隱藏了我們為優化輸出而希望控制的細節和引數。通常,常見任務(如 EXIF 元資料解釋)會導致程式碼重複,進而妨礙維護和全域性改進。使用最新的壓縮庫,如 MozJpeg,需要用 C/C++ 編寫的原生程式碼。我們想讓開發人員更容易傳送較小的檔案,同時保持對影象質量的控制,而不需要編寫自定義的或難以維護的解決方案。
現代智慧手機捕捉的影象解析度很高,大檔案使得某些行動網路上的上傳不可靠。以全解析度傳送通常是一種浪費,因為內容傳遞網路(CDN)無論如何都會調整接收方的影象大小。
調整發送方裝置上的影象大小可以減少傳送影象所需的頻寬,最小化整個管道的負載開銷,改善端到端體驗。剩下的挑戰是如何在保持影象質量的同時受益於較小的檔案大小。
Spectrum:構建影象處理基礎設施
對於移動開發人員來說,Spectrum 使常見的影象操作變得簡單、高效、一致。它的宣告性 API 允許開發人員關注所需的輸出屬性,而不是單個步驟。其次,這使得 Spectrum 可以透明地選擇最優的方式來滿足轉碼請求。例如,如果有機會,Spectrum 會優先 使用無損操作對 JPEG 影象進行裁剪和旋轉 。另一個例子是 調整大小 ,Spectrum 會優化解碼器取樣和畫素級完美調整(pixel-perfect resizing)之間的相互作用。
“菜譜(Recipes)”幫助開發人員為每個請求選擇最佳的執行順序。這些是由外掛提供的。例如,JPEG 外掛將提供 JPEG 影象無損裁剪和旋轉菜譜。所有菜譜都在內部聚合並排序,這樣,無損且高效的菜譜就位於頂部。對於每個請求,Spectrum 將迭代列表並執行第一個匹配(因此是最有效)的菜譜。最後一個方法是一個通用菜譜,它可以通過解碼和編碼影象來處理任何請求。
Spectrum 的核心是用 C++ 編寫的,可以在 Android 和 iOS 應用之間共享,這使得我們的輸出更加一致。它提供的 Java 和 Objective-C API 只是對這個核心的簡單包裝,目的是簡化開發。此外,C++ 核心提供了對記憶體分配的更多控制,通常會使計算密集型操作具有更高的執行速度。
與原生庫(如 MozJpeg )的整合使得 Spectrum 可以控制通用平臺 API 之外的編碼引數。它使得開發人員可以利用計算密集型編碼,這需要更多的處理時間,但大大減少了檔案大小。例如柵格量化和掃描優化。這在移動端是一個重要的權衡。在移動端,緩慢的網路連線會影響上傳體驗。它還使我們能夠控制更高階的引數,如 色度抽樣 ,利用邊緣銳化和插圖提高影象質量。一致的 API 使得不是影象專家的開發人員也能夠利用這些特性。
該庫的核心是用 C++ 實現的。它將傳入請求與一組可以實現影象操作的“菜譜”進行匹配。這裡會優先考慮更高效的無損操作。外掛提供了對影象格式和其他菜譜的支援。
我們希望 Spectrum 能像幫助 Facebook 實現更好的影象生成體驗一樣,讓開發者受益。在我們的應用中,Spectrum 提高了整個應用程式大規模影象上傳的可靠性和質量。與基線編碼器相比,與 Mozilla JPEG 的預設整合使得上傳檔案的大小減少了 15%。我們很希望看到社群如何使用 Spectrum 1.0.0 庫來改善應用程式的照片體驗。
檢視英文原文: Facebook open-sources Spectrum 1.0.0 for better mobile image production