
Как я добавил HEIF, HEIC и AVIF в Android-ImageMagick7
AIgrator 4 минуты назад Как я добавил HEIF, HEIC и AVIF в Android-ImageMagick7 Средний 3 мин 111 Android * C++ * Open source * Туториал Моё приложение Image Converter конвертирует изображения из любых форматов в любые....
<5 — 2026'da uzaya kaç SpaceX Starship fırlatması ulaşacak?
Вот важная новость с фронта ИИ: AIgrator 4 минуты назад Как я добавил HEIF, HEIC и AVIF в Android-ImageMagick7 Средний 3 мин 111 Android * C++ * Open source * Туториал Моё приложение Image Converter конвертирует изображения из любых форматов в любые. В основе — ImageMagick 7, портированный под Android через NDK-сборку. Базовая версия ImageMagick для Android умела JPEG, PNG, WebP, TIFF.
Но HEIF, HEIC, AVIF — нет. А это современные форматы, которые используют камеры iPhone (HEIC), Google Photos (AVIF), и в которые сжимают изображения всё чаще. Внедрение шло в два этапа.
Технические детали
Этап 1: HEIF/HEVC (чтение)Задача — чтобы ImageMagick мог читать HEIC/HEIF. Для этого нужна цепочка:ImageMagick → coders/heic. c → libheif → libde265 (HEVC decoder) libde265 — декодер HEVC (H.
265), написан на C++. Собирается как обычная ndk-build статическая библиотека. libheif — библиотека для парсинга HEIF/ISOBMFF контейнеров.
Тоже C++, но тут начались проблемы. Проблема №1: плагины не регистрируютсяlibheif использует C++ статическую инициализацию для регистрации декодеров. cc есть глобальный объект Register_Default_Plugins, который должен вызываться при загрузке .
Отраслевые последствия
Но на Android порядок статической инициализации не гарантирован. Симптом: heif_init() думает «плагины уже зарегистрированы» (потому что default_plugins_registered = true), хотя на самом деле Register_Default_Plugins ещё не отработал. В результате — ошибка:No decoding plugin installed for this compression format (11.
6003)Решение: поменять default_plugins_registered = true → false в init. Теперь heif_init() всегда регистрирует плагины принудительно, независимо от C++ static init. Проблема №2: race condition конструктораВ coders/heic.
c был добавлен конструктор:__attribute__((constructor)) static void InitializeHEIF(void) { heif_init(NULL); } который вызывал heif_init() при загрузке . Но из-за гонки с C++ статическим инициализатором libheif плагины либо не регистрировались, либо регистрировались дважды. Решение: убрать конструктор полностью.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.




