このトピックでは、AV1 Image File Format(AVIF)エンコーディングをモバイル クライアントに統合する方法について説明し、実装例を示します。
AVIF エンコーディングのサポートは現在実験段階にあり、機能の調整や更新が行われる可能性があります。運用環境に組み込む際は注意し、AVIF エンコーディングに関するドキュメントの更新を監視してください。
AVIF エンコーディング
AVIF(AV1 Image File Format)は、AV1 ビデオエンコーディングに基づく画像ファイル形式であり、ハイ ダイナミック レンジ(HDR)と透過チャネルをサポートしています。 AVIF は、JPEG や PNG と比較して、ファイルサイズを小さくしながら、より高い画質と圧縮性能を実現します。Object Storage Service(OSS)は、AVIF のエンコーディングとデコーディングを完全にサポートしています。
例
以下の統合例には、重要なコード スニペットのみが含まれています。詳細な統合例と完全なサンプルコードにアクセスするには、iOS のサンプル プロジェクトとAndroid のサンプル プロジェクトをダウンロードしてください。
iOS
依存関係
iOS は AVIF エンコーディングをネイティブでサポートしていません。 iOS で AVIF デコーディングを実装するには、サードパーティ ライブラリである libavif と SVT-AV1 を使用する必要があります。
オープンソースの libavif と SVT-AV1 には、エンコーディング パフォーマンスが低い、奇数サイズの画像エンコーディングがサポートされていないなど、一定の制限があります。これらの問題に対処し、AVIF エンコーディング パフォーマンスを向上させるために、最適化されたバージョンのこれらのライブラリを提供しています。最適化されたバージョンを使用することをお勧めします。
CocoaPods を使用して libavif と SVT-AV1 を追加します。
Podfile に Alibaba Cloud のリポジトリ宣言を次のように追加します。
source 'https://github.com/aliyun/aliyun-specs.git'AVIF のエンコーディングとデコーディングのための依存関係を次のように追加します。
pod 'SDWebImage' pod 'SDWebImageAVIFCoder', '0.12.1' pod 'libavif/svt-av1', '1.1.1' pod 'svt-av1', '1.2.2' pod 'libdav1d', '1.2.0'
画像エンコーディング呼び出し
SDWebImage は、特定の画像形式のエンコーディングとデコーディングを可能にするコーデック ライブラリを提供します。 SDWebImageAVIFCoder を統合することで、ユーザーは画像を AVIF に変換できます。
AppDelegate.m ファイルで、次の行を追加して SDWebImageAVIFCoder をインポートします。
SDImageAVIFCoder *avifCoder = [SDImageAVIFCoder sharedCoder]; [[SDImageCodersManager sharedManager] addCoder:avifCoder];SDWebImage を使用して画像を AVIF にエンコードします。
// エンコードする画像。 UIImage *image = [UIImage imageNamed:@"test-image.jpg"]; id<SDImageCoder> coder = [SDImageCodersManager sharedManager]; NSData *encodedData = [coder encodedDataWithImage:image format:SDImageFormatAVIF options:nil];
エンコーディングが完了したら、エンコードされた AVIF 画像をローカル デバイスに保存します。
Android
依存関係
エンコーディングとデコーディング用の ARR ファイルを追加します: avifandroidjni-release.aar。
画像エンコーディング呼び出し
AvifDecoder クラスの encodeRGBA8888 メソッドを使用して、AVIF エンコーディングを実装します。
/**
* rgba データを AVIF 画像にエンコードします。
* @param rgbaData RGBA8888 バイト バッファ。
* @param length バッファ長。
* @param width 画像の幅。
* @param height 画像の高さ。
* @return エンコーディング後のバイト配列。
*/
public static native byte[] encodeRGBA8888(ByteBuffer rgbaData, int length, int width, int height);次のサンプルコードは、エンコーディング呼び出しの例を示しています。ここで、avifBytes はエンコーディング後のバイト配列です。
val pixelBuffer = ByteBuffer.allocateDirect(bitmap.width * bitmap.height * 4)
bitmap.copyPixelsToBuffer(pixelBuffer)
val avifBytes = AvifDecoder.encodeRGBA8888(
pixelBuffer,
bitmap.width * bitmap.height * 4,
bitmap.width,
bitmap.height
)次のステップ
デコーディングのサポートを実装するには、Android での HEIC および AVIF デコーディングとiOS での HEIC および AVIF デコーディングの AVIF デコーディングに関する説明を参照してください。