HEIF & AVIF

Большинство Android-разработчиков по-прежнему используют форматы JPEG или PNG для сохранения изображений. Это классика, проверенные и надежные форматы. Но представьте, что вы сохраняете то же изображение высокого качества при вдвое меньшем размере файла и без потери деталей.

Это уже не фантастика. Инструмент готов к использованию, и настало время освоить более разумный и эффективный способ работы с медиа на Android.

Что такое HEIF и почему он важен?

HEIF (High Efficiency Image File Format — формат файлов изображений высокого качества) — современный медиа-контейнер, который стал прорывом в индустрии. Он позволяет сохранять фотографии размером на 50 % меньше по сравнению с классическим JPEG при том же визуальном качестве.

HEIF можно считать «WebP для фотографий», но с еще большими возможностями:

  • поддержкой HDR (High Dynamic Range — расширенный динамический диапазон);
  • последовательностью изображений (идеально подходят для хранения серийных фотографий);
  • 10-битной глубиной цвета для более насыщенных и плавных переходов;
  • неразрушающим редактированием (можно сохранять инструкции для правок вместе с изображением).

А знаете, что самое приятное? Jetpack для Android обеспечил невероятно простое интегрирование со специальной библиотекой HeifWriter.

Шаг 1: ознакомьтесь с HeifWriter — новым MVP в области мультимедиа

Класс HeifWriter, входящий в состав AndroidX Jetpack, — это специализированный инструмент, предназначенный для работы с форматами нового поколения.

Он позволяет:

  • записывать изображения (отдельные кадры или последовательности) в высокоэффективные форматы файлов .heic или .heif;
  • использовать сжатие HEVC (H.265), которое обеспечивает значительную экономию места;
  • поддерживать кодирование AVIF (на основе кодека AV1), которое предлагает еще лучшее сжатие, чем HEIF;
  • обрабатывать расширенные функции, такие как 10-битная глубина цвета, для приложений профессиональной фотографии;
  • безупречно работать с существующим графическим конвейером Android через вход Surface.

Короче говоря: лучшее качество, значительно меньший размер файлов и готовность к будущему мобильной фотографии.

Шаг 2: почему это революционное изменение для Android-приложений 

Если ваше приложение активно работает с мультимедиа, внедрение HeifWriter —  стратегический шаг, который напрямую улучшает пользовательский опыт и снижает инфраструктурные затраты.

Это важно, если вы создаете:

  • Пользовательское приложение «Camera» («Камера») или «Gallery» («Галерея»): сохраняйте изображения высокого разрешения, которые занимают половину локального хранилища пользователя.
  • Приложение для редактирования фотографий или фильтрации: экспортируйте отредактированные файлы, которые быстрее распространяются и загружаются.
  • Социальное или мессенджер-приложение с медиаконтентом: сокращайте использование полосы пропускания для загрузки и скачивания, это приведет к более быстрой загрузке для всех.

Результат: более быстрая загрузка, меньший объем необходимого хранилища и заметно более плавный и современный пользовательский опыт.

 Шаг 3: интеграция HeifWriter в Kotlin

Начать работу очень просто. Добавьте зависимость в файл build.gradle вашего модуля:

implementation "androidx.heifwriter:heifwriter:1.1.0"

Вот упрощенный пример на Kotlin для записи одного изображения (например, из Bitmap, преобразованного в Surface):

fun writeImageToHeif(
    bitmap: Bitmap, 
    filePath: String
) {
    // 1. Определение размера выходного файла и пути к файлу
    val width = bitmap.width
    val height = bitmap.height

    // 2. Создание экземпляра HeifWriter
    val heifWriter = HeifWriter.Builder(
        filePath, // например, /storage/emulated/0/DCIM/my_photo.heic
        width, 
        height, 
        HeifWriter.INPUT_MODE_SURFACE // Использование SURFACE для эффективной записи
    )
        // 3. Установка уровня качества (например, 90 для хорошего баланса)
        .setQuality(90) 
        // 4. По желанию, запрос кодирования AVIF для максимальной эффективности (если поддерживается)
        .setEncoding(HeifWriter.HEVC_ENCODING_AVIF) 
        .build()

    try {
        // Получение входного surface от модуля записи
        val surface = heifWriter.surface
        
        // Использование Canvas для рисования Bitmap на Surface
        val canvas = surface.lockCanvas(null)
        // Примечание: в продакшене обычно используют HardwareBuffer/OpenGL для поддержания эффективности без копирования
        canvas.drawBitmap(bitmap, 0f, 0f, null) 
        surface.unlockCanvasAndPost(canvas)

        // 5. Сигнал о готовности кадра
        heifWriter.setEndOfStream() 
        
        // 6. Дождаться завершения кодирования и закрыть файл
        heifWriter.stop(5000) // Ждать завершения кодирования до 5 секунд

        // Комментарий: Успешно! Ваш новый HEIF-файл готов, вероятно, он будет в два раза меньше JPEG.
        println("HEIF file written successfully to $filePath") 

    } catch (e: Exception) {
        // Комментарий: Корректно обрабатывайте исключения ввода-вывода, кодека или таймаута
        e.printStackTrace()
    } finally {
        heifWriter.close()
    }
}

Шаг 4: версия 1.1.0 — готова к производственному использованию

Недавнее обновление до версии 1.1.0 (выпущенной в конце 2025 года) укрепило позиции HeifWriter как серьезного конкурента для производственных приложений:

  • Кодирование AVIF: поддержка передового формата AVIF, предлагающего превосходную компрессию по сравнению с HEIF/HEVC.
  • Поддержка 10-битных изображений: необходимо для высокопроизводительных устройств и профессиональных рабочих процессов с изображениями.
  • Улучшенная поддержка Kotlin: более качественные аннотации null-safety для чистого и надежного кода Kotlin.
  • Улучшения производительности: оптимизированное управление буфером и общее повышение скорости.

Сравнение форматов

Почему вам нужно освоить HeifWriter сейчас?

Игнорируя эти новые форматы, вы, как Android-разработчик, упускаете значительные преимущества в производительности и пользовательском опыте. И Apple, и Google (нативные приложения Android для фотографий/камеры) перешли на HEIF. Instagram и другие крупные платформы уже поддерживают эти форматы для экономии трафика.

Интегрируя HeifWriter сегодня, вы не просто оптимизируете свое приложение — вы готовите его к будущему и приводите в соответствие с медиа-стандартами следующего десятилетия. Эта библиотека абстрагирует сложные детали кодеков, предоставляя вам все преимущества с минимальными затратами на интеграцию.

Часто задаваемые вопросы (FAQ)

Будут ли изображения HEIF/AVIF работать на старых Android-устройствах?

Библиотека HeifWriter сама по себе обратно совместима, но просмотр полученных файлов HEIF/AVIF зависит от версии Android на устройстве и аппаратного декодера. Как правило, Android 9 (Pie) и выше отлично поддерживают HEIF. Для старых устройств нужно будет либо использовать резервный вариант JPEG, либо добавить программный декодер. Однако использование HEIF для сохранения новых изображений уже сейчас подготовит вас к текущему состоянию рынка.

Можно ли использовать этот формат для анимации, как альтернативу GIF?

Конечно! HEIF отлично подходит для хранения последовательностей изображений, часто в формате HEIC. Это превосходная альтернатива GIF, поскольку позволяет хранить несколько кадров с гораздо лучшим сжатием и 10-битным цветом, что делает этот формат идеальным для серийных фотографий, Live Photo или коротких видеороликов.

Влияет ли использование HeifWriter на производительность из-за сложного сжатия?

Да, кодирование HEVC (HEIF) или AV1 (AVIF) требует больше вычислительных ресурсов, чем JPEG. Однако современные Android-устройства имеют специальные аппаратные кодировщики, встроенные в их чипсеты. Библиотека HeifWriter разработана для эффективного использования этих аппаратных кодировщиков. Это означает приемлемую скорость обработки даже при захвате одиночного изображения, предлагая прекрасный компромисс в виде значительного уменьшения размера файла.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Sivavishnu: Stop Saving JPEG/PNG: How HEIF & AVIF Cut Android Image Storage by 50%

Предыдущая статьяRuby может быть лучше Python для абсолютных новичков