tạo ảnh HEIF

Các thiết bị chạy Android 10 hỗ trợ định dạng hình ảnh nén HEIC, một thương hiệu dành riêng cho phương thức mã hoá video hiệu quả cao (HEVC) của định dạng tệp hình ảnh hiệu quả cao (HEIF) như nêu trong ISO/IEC 23008-12. Hình ảnh được mã hoá HEIC có chất lượng hình ảnh tốt hơn với kích thước tệp nhỏ hơn so với tệp JPEG.

Hình ảnh HEIC được tạo bằng khung máy ảnh yêu cầu một hình ảnh không nén từ HAL máy ảnh và gửi hình ảnh đó đến hệ thống con đa phương tiện để được mã hoá bằng bộ mã hoá HEIC hoặc HEVC.

Yêu cầu

Để hỗ trợ định dạng hình ảnh HEIC, thiết bị của bạn phải có bộ mã hoá phần cứng hỗ trợ MIMETYPE_IMAGE_ANDROID_HEIC hoặc MIMETYPE_VIDEO_HEVC với chế độ chất lượng không đổi.

Triển khai

Để hỗ trợ định dạng hình ảnh HEIC trên thiết bị, hãy triển khai bộ mã hoá và giải mã HEIC/HEVC và hỗ trợ các cấu hình luồng bắt buộc, đó là luồng IMPLEMENTATION_DEFINED/YUV và luồng phân đoạn ứng dụng JPEG.

Nội dung nghe nhìn

Triển khai bộ mã hoá và giải mã HEIC/HEVC ở chế độ chất lượng không đổi (CQ) cho phần cứng tương ứng như sau:

  • Bộ mã hoá và giải mã loại HEVC sử dụng định dạng IMPLEMENTATION_DEFINED với mức sử dụng GRALLOC_USAGE_HW_VIDEO_ENCODER hoặc định dạng HAL_PIXEL_FORMAT_YCBCR_420_888 tuỳ thuộc vào kích thước hình ảnh.
  • Bộ mã hoá và giải mã loại HEIC sử dụng định dạng IMPLEMENTATION_DEFINED với cách sử dụng GRALLOC_USAGE_HW_IMAGE_ENCODER.

Camera

Trong siêu dữ liệu tĩnh, hãy đặt ANDROID_HEIC_INFO_SUPPORTED thành true và ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT thành một giá trị trong khoảng từ [1, 16], cho biết số lượng phân đoạn ứng dụng JPEG.

Đối với mỗi tổ hợp luồng bắt buộc, thiết bị máy ảnh của bạn phải hỗ trợ việc hoán đổi luồng JPEG với luồng HEIC có cùng kích thước.

Đối với luồng đầu ra HEIC tại API công khai, dịch vụ máy ảnh sẽ tạo 2 luồng nội bộ HAL:

  • Luồng BLOB có cờ sử dụng JPEG_APPS_SEGMENT để lưu trữ các phân đoạn ứng dụng, bao gồm cả phân đoạn EXIF và hình thu nhỏ
  • IMPLEMENTATION_DEFINED hoặc YCBCR_420_888 truyền kích thước của luồng HEIC tuỳ thuộc vào bộ mã hoá và giải mã mục tiêu và kích thước luồng HEIC

Dựa trên ANDROID_HEIC_INFO_MAX_JPEG_APP_SEGMENTS_COUNT, khung máy ảnh sẽ phân bổ bộ đệm đủ lớn để HAL máy ảnh điền sẵn các phân đoạn ứng dụng JPEG. Phân đoạn APP1 là bắt buộc, nhưng các phân đoạn sau phân đoạn APP1 (APP2 trở lên) là không bắt buộc. Khung máy ảnh ghi đè các thẻ EXIF trong phân đoạn APP1 có thể bắt nguồn từ siêu dữ liệu kết quả chụp hoặc liên quan đến luồng bit hình ảnh chính và gửi các thẻ đó đến MediaMuxer.

Vì bộ mã hoá nội dung đa phương tiện nhúng hướng vào siêu dữ liệu của hình ảnh đầu ra, để đảm bảo hướng nhất quán giữa hình ảnh chính và hình thu nhỏ, HAL của máy ảnh không được xoay hình thu nhỏ dựa trên android.jpeg.orientation. Khung ghi hướng vào siêu dữ liệu EXIF và vùng chứa HEIC.

Các thẻ siêu dữ liệu tĩnh, điều khiển và động liên quan đến định dạng JPEG cũng áp dụng cho định dạng HEIC. Ví dụ: thẻ siêu dữ liệu android.jpeg.orientationandroid.jpeg.quality trong yêu cầu chụp được dùng để kiểm soát hướng và chất lượng của hình ảnh HEIC.

Để sử dụng định dạng HEIC trong ứng dụng, hãy sử dụng API công khai HEIC.

Để biết thêm thông tin, hãy xem các nguồn sau.

Camera HAL

Không gian dữ liệu vùng đệm đồ hoạ

Dung lượng sử dụng vùng đệm đồ hoạ

Xác nhận kết quả

Để xác thực rằng cách triển khai của bạn hỗ trợ hình ảnh HEIC, hãy sử dụng ứng dụng kiểm thử TestingCamera2 và chạy các kiểm thử CTS và VTS sau đây cho máy ảnh.

Kiểm thử CTS của máy ảnh

Kiểm thử VTS của máy ảnh