Crear mis propios archivos HEIF/HEIC

He estado buscando durante un tiempo una forma de comenzar a empaquetar flujos de bytes de imágenes en archivos HEIF, ya que macOS High Sierra e iOS 11 ya están disponibles. No he tenido mucha suerte, solo un gran número de personas convirtiendo archivos .heic a .jpg, y el visor Nokia JS en GitHub

Para empezar, no estoy buscando convertir mi biblioteca de fotos existente en archivos .heic codificados en HEVC, hay rendimientos decrecientes allí, ya que ya están jpegged y han perdido calidad con respecto al original. Entonces, esta pregunta no es un duplicado de la pregunta " Convertir toda la biblioteca al nuevo formato .HEIC ".

Mi meta:

  • Tome un flujo de bytes mpeg y un flujo de bytes PNG o JPG y empáquelos en un archivo .heic

  • Tome varios flujos de bytes PNG y/o JPG y cree un archivo .heic de ellos (como una serie de fotos en ráfaga)

HEIF es solo un contenedor, por lo que, si bien fue diseñado para el uso de HEVC, admite otros tipos de datos como jpg, png, prácticamente cualquier cosa que admitan las aplicaciones de visualización en sus formatos de archivo nativos.

Simplemente no he podido encontrar ningún software que me permita hacerlo. Todo lo que busco que tenga que ver con HEIF o HEIC en el término simplemente me llena de titulares de noticias tecnológicas sobre Apple tratando de reemplazar jpeg, y personas que convierten sus archivos .heic una vez que se importan de su computadora (lo que parece que tomaría un esfuerzo hacerlo dado que iOS los convertirá por defecto si intenta importarlos o compartirlos en cualquier lugar, no puede confirmar explícitamente que el extremo de alcance los admita...)

Así que espero que alguien aquí sepa un par de cosas y pueda indicarme la dirección correcta al menos.

No soy adverso a las herramientas de línea de comandos, o incluso a hacer algo de desarrollo yo mismo si puedo señalar una biblioteca que puedo importar a una aplicación Swift (soy un desarrollador tardío en programación, y aunque podría decir lo mismo para Javascript , si tuviera que crear una aplicación alrededor de una biblioteca para hacer este trabajo, preferiría usar Swift que usar un lenguaje de secuencias de comandos)

¡Así que espero que alguien haya pensado lo mismo y haya tenido más suerte que yo al encontrar esto! :)

Edición 1, 10 de noviembre:

Encontré un sitio de un tipo llamado Ben Gotow que habla sobre convertir archivos JPEG existentes en flujos de bits HEVC y luego colocarlos en un contenedor .heic o .heif. Está cerca, pero no había podido encontrar muchos detalles para hacer más que eso. No estoy agregando esto como una respuesta, solo como una edición, ya que es relevante pero en realidad no logra mi objetivo. ¡Espero que cualquier otra persona que encuentre esta pregunta encuentre útil su sitio!
jpgtoheif.com

parece que será muy difícil encontrar la respuesta sobre "crear" estos archivos por su cuenta, ya que es difícil encontrar incluso una aplicación de visualización para HEIC , sin mencionar la creación/edición...
Sí, esa es mi preocupación... Aún así, al menos si hago la pregunta, espero que gradualmente otras personas encuentren esta pregunta y tal vez incluso contribuyan con lo que han encontrado. Para ellos, todo lo que puedo encontrar, sin importar lo que busque, son las publicaciones "¿Cómo convierto HEIC/HEIF a JPEG?". Y un sitio web que habla sobre convertir jpegs y videos a HEVC y colocarlos en un contenedor HEIF (estoy a punto de agregar eso a la pregunta original como una edición, ya que de todos modos tiene algunos datos relevantes :)

Respuestas (2)

Este uso de GPAC puede acercarse a los objetivos que desea:

¿Qué es GPAC?

GPAC es un marco multimedia de código abierto. ¡GPAC se utiliza con fines académicos y de investigación y más allá a través de colaboraciones industriales! El proyecto cubre diferentes aspectos de multimedia, con un enfoque en tecnologías de presentación (gráficos, animación e interactividad) y en formatos de empaque multimedia como MP4.

Más detalles:

¡Un poco más de investigación y una respuesta aquí proporciona el camino! Necesitamos varias cosas instaladas, idealmente con homebrew:

  • x265 y GPACbrew install x265 gpac

  • FFmpeg con soporte x265

    brew install ffmpeg --with-fdk-aac --with-ffplay --with-freetype --with-libass --with-libquvi --with-libvorbis --with-libvpx --with-opus --with-x265
    

Referencia

Ahora que tiene las herramientas, pruebe un script como este para convertir imágenes en una carpeta a HEIF/HEIC:

for F in *.jpg *.png *.tif *.tiff; \
  do ffmpeg -i "$F" -crf 23 -vf "scale=trunc(iw/2)*2:trunc(ih/2)*2" -preset slower -pix_fmt yuv420p -f hevc "${F%.*}.hvc" && \
     MP4Box -add-image "${F%.*}.hvc" -ab heic -new "${F%.*}.heic" && \
     rm "${F%.*}.hvc";
  done;

Lo probé con una carpeta de imágenes y funciona. Convierte imágenes con dimensiones impares en dimensiones pares, por ejemplo, pero además de algunas advertencias, funciona.

¡Voy a estar leyendo mucho ahora, parece! Si puede obtener lo que busco al pie de la letra, volveré aquí y editaré lo que encuentre al final de su respuesta para cualquier otra persona que pueda estar buscando lo mismo y lo marcaré como aceptado, a menos que alguien más venga. con una mejor respuesta :)
No, esto no responde a que tome múltiples flujos de bytes PNG y/o JPG y haga un archivo .heic de ellos (como una serie de fotos en ráfaga), pero sospecho que solo requiere aprender un poco más de GPAC. ¡Parece bastante versátil!
Como punto de interés, no está restringido a imágenes JPEG, PNG y TIFF. FFmpeg admite otros formatos de imagen. JPEG2000 funcionó de inmediato cuando se probó, por ejemplo.

Instale ImageMagick y use convertel formato básico para pasar de un formato a otro.

Sé que este es un hilo antiguo, pero publico mis dos centavos que en 2020 es mucho más fácil convertir imágenes a HEIC en masa hoy en día que en el pasado.

El primer paso es instalar ImageMagick y ExifTool a través de Homebrew de esta manera:

brew install imagemagick exiftool

Una vez que haya instalado ImageMagick, la conversión a HEIC es tan simple como esto:

convert image.jpg image.heic

¡Eso es todo! ImageMagick convierte archivos de un formato a otro según la extensión del archivo de destino. Y todos los metadatos del archivo de origen se transfieren limpiamente del archivo antiguo al archivo nuevo mediante el uso de ExifTool después de que se haya realizado la conversión de la imagen.

Entonces, en este ejemplo, solo nombrar el archivo de destino image.heices suficiente para generar un archivo HEIC a partir del archivo de origen image.jpg.

Pero como tuve que convertir en masa algunos directorios llenos de imágenes, escribí este sencillo script Bash que busca en un directorio imágenes JPG, PNG y TIFF y luego las ejecuta a través de ImageMagick y guarda un archivo HEIC con el mismo nombre de archivo en el mismo directorio.

Simplemente tome este script y cámbielo /path/to/imagespara que coincida con su directorio de origen y ¡ya está todo listo!

find -E '/path/to/images' -type f -iregex '.*\.(JPG|JPEG|PNG|TIF|TIFF)$' |\
  while read full_image_path
  do
    path_sans_extension="${full_image_path%.*}"
    convert "${full_image_path}" "${path_sans_extension}".heic
    exiftool -overwrite_original_in_place -tagsFromFile "${full_image_path}" "${path_sans_extension}".heic
  done