搭載 Android 10 的裝置支援 HEIC 壓縮圖片格式,這是高效率視訊編碼 (HEVC) 專屬的品牌,根據 ISO/IEC 23008-12 所述,屬於高效率圖片檔案格式 (HEIF)。與 JPEG 檔案相比,HEIC 編碼的圖片品質較佳,且檔案大小較小。
HEIC 圖片是由相機架構產生,該架構會向相機 HAL要求未壓縮的圖片,並將圖片傳送至媒體子系統,由 HEIC 或 HEVC 編碼器進行編碼。
需求條件
如要支援 HEIC 圖片格式,您的裝置必須具備硬體編碼器,且支援 MIMETYPE_IMAGE_ANDROID_HEIC
或 MIMETYPE_VIDEO_HEVC
,並使用持續品質模式。
實作
如要支援裝置上的 HEIC 圖片格式,請實作 HEIC/HEVC 編解碼器,並支援必要的串流設定,也就是 IMPLEMENTATION_DEFINED
/YUV
串流和 JPEG 應用程式區段串流。
媒體
針對對應的硬體,在恆定品質 (CQ) 模式中實作 HEIC/HEVC 編解碼器,如下所示:
- 視圖片大小而定,HEVC 類型轉碼器會使用
IMPLEMENTATION_DEFINED
格式搭配GRALLOC_USAGE_HW_VIDEO_ENCODER
用法,或HAL_PIXEL_FORMAT_YCBCR_420_888
格式。 - HEIC 類型編解碼會使用
IMPLEMENTATION_DEFINED
格式,並使用GRALLOC_USAGE_HW_IMAGE_ENCODER
。
相機
在靜態中繼資料中,將 ANDROID_HEIC_INFO_SUPPORTED
設為 true,並將 ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT
設為 [1, 16]
之間的值,表示 JPEG 應用程式區段的數量。
對於每個必要串流組合,相機裝置必須支援將 JPEG 串流與相同大小的 HEIC 串流互換。
針對公開 API 的 HEIC 輸出串流,相機服務會建立兩個 HAL 內部串流:
- 具有
JPEG_APPS_SEGMENT
使用旗標的 BLOB 串流,用於儲存包含 EXIF 和縮圖區隔的應用程式區隔 IMPLEMENTATION_DEFINED
或YCBCR_420_888
會根據目標編解碼和 HEIC 串流大小,串流 HEIC 串流的大小
根據 ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT
,相機架構會配置足夠大的緩衝區,讓相機 HAL 填入 JPEG 應用程式區段。APP1
區段為必填欄位,但 APP1
區段後面的區段 (APP2
以上) 為選填欄位。相機架構會覆寫 APP1
區段中的 EXIF 標記,這些標記可從擷取結果中繼資料衍生,或與主圖片位元串流相關,並將這些標記傳送至 MediaMuxer
。
由於媒體編碼器會將方向嵌入輸出圖片的中繼資料,因此為了確保主圖片和縮圖的方向一致,相機 HAL 不得根據 android.jpeg.orientation.
旋轉縮圖圖片。架構會將方向寫入 EXIF 中繼資料和 HEIC 容器。
與 JPEG 格式相關的靜態、控制和動態中繼資料標記也適用於 HEIC 格式。舉例來說,擷取要求中的 android.jpeg.orientation
和 android.jpeg.quality
中繼資料標記可用於控制 HEIC 圖片的方向和品質。
如要在應用程式中使用 HEIC 格式,請使用 HEIC 公用 API。
如需更多資訊,請參閱下列來源。
相機 HAL
圖形緩衝區資料空間
圖形緩衝區使用空間
驗證
如要驗證您的實作內容是否支援 HEIC 圖片,請使用 TestingCamera2
測試應用程式,並執行下列相機 CTS 和 VTS 測試。
相機 CTS 測試
NativeImageReaderTest#testHeic
ImageReaderTest#testHeic
ImageReaderTest#testRepeatingHeic
ReprocessCaptureTest#testBasicYuvToHeicReprocessing
ReprocessCaptureTest#testBasicOpaqueToHeicReprocessing
RobustnessTest#testMandatoryOutputCombinations
StillCaptureTest#testHeicExif
相機 VTS 測試