Как работать с типами файлов изображений HEIC в Python - PullRequest
0 голосов
/ 28 января 2019

Формат Высокоэффективный файл изображения (HEIF) используется по умолчанию при передаче изображения с iPhone на устройство OSX.Я хочу редактировать и изменять эти файлы .HEIC с помощью Python.

Я мог бы изменить настройки телефона, чтобы сохранить их как JPG по умолчанию, но это не решает проблему возможности работать с типом файла от других.Я все еще хочу иметь возможность обрабатывать файлы HEIC для преобразования файлов, извлечения метаданных и т. Д. ( Пример использования - геокодирование )

Подушка

Вот результат работы с Python 3.7 и Pillow при попытке прочитать файл этого типа.

$ ipython
Python 3.7.0 (default, Oct  2 2018, 09:20:07)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from PIL import Image

In [2]: img = Image.open('IMG_2292.HEIC')
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
<ipython-input-2-fe47106ce80b> in <module>
----> 1 img = Image.open('IMG_2292.HEIC')

~/.env/py3/lib/python3.7/site-packages/PIL/Image.py in open(fp, mode)
   2685         warnings.warn(message)
   2686     raise IOError("cannot identify image file %r"
-> 2687                   % (filename if filename else fp))
   2688
   2689 #

OSError: cannot identify image file 'IMG_2292.HEIC'

Похоже, была запрошена поддержка в python-pillow ( # 2806 ), но есть проблемы с лицензированием / патентами, мешающие этому.

ImageMagick + Wand

Похоже, что ImageMagick может быть вариантом.Однако после выполнения brew install imagemagick и pip install wand я потерпел неудачу.

$ ipython
Python 3.7.0 (default, Oct  2 2018, 09:20:07)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from wand.image import Image

In [2]: with Image(filename='img.jpg') as img:
   ...:     print(img.size)
   ...:
(4032, 3024)

In [3]: with Image(filename='img.HEIC') as img:
   ...:     print(img.size)
   ...:
---------------------------------------------------------------------------
MissingDelegateError                      Traceback (most recent call last)
<ipython-input-3-9d6f58c40f95> in <module>
----> 1 with Image(filename='ces2.HEIC') as img:
      2     print(img.size)
      3

~/.env/py3/lib/python3.7/site-packages/wand/image.py in __init__(self, image, blob, file, filename, format, width, height, depth, background, resolution, pseudo)
   4603                     self.read(blob=blob, resolution=resolution)
   4604                 elif filename is not None:
-> 4605                     self.read(filename=filename, resolution=resolution)
   4606                 # clear the wand format, otherwise any subsequent call to
   4607                 # MagickGetImageBlob will silently change the image to this

~/.env/py3/lib/python3.7/site-packages/wand/image.py in read(self, file, filename, blob, resolution)
   4894             r = library.MagickReadImage(self.wand, filename)
   4895         if not r:
-> 4896             self.raise_exception()
   4897
   4898     def save(self, file=None, filename=None):

~/.env/py3/lib/python3.7/site-packages/wand/resource.py in raise_exception(self, stacklevel)
    220             warnings.warn(e, stacklevel=stacklevel + 1)
    221         elif isinstance(e, Exception):
--> 222             raise e
    223
    224     def __enter__(self):

MissingDelegateError: no decode delegate for this image format `HEIC' @ error/constitute.c/ReadImage/556

Есть ли другие альтернативы для программного преобразования?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Ребята, вы должны проверить эту библиотеку, это оболочка Python 3 для библиотеки libheif , она должна служить вашей цели преобразования файлов, извлечения метаданных:

https://github.com/david-poirier-csn/pyheif

https://pypi.org/project/pyheif/

Пример использования:

 import whatimage
 import pyheif
 from PIL import Image


 def decodeImage(bytesIo):

    fmt = whatimage.identify_image(bytesIo)
    if fmt in ['heic', 'avif']:
         i = pyheif.read_heif(bytesIo)

         # Extract metadata etc
         for metadata in i.metadata or []:
             if metadata['type']=='Exif':
                 # do whatever

         # Convert to other file format like jpeg
         s = io.BytesIO()
         pi = Image.frombytes(
                mode=i.mode, size=i.size, data=i.data)

         pi.save(s, format="jpeg")

  ...
0 голосов
/ 02 июля 2019

Я сталкиваюсь с той же проблемой, что и вы, желая решения CLI.Проводя дальнейшие исследования, кажется, что ImageMagick требует libheif библиотеки делегатов.Кажется, что у самой библиотеки libheif также есть некоторые зависимости.

Мне не удалось заставить их работать, но я продолжу попытки.Я предлагаю вам проверить, доступны ли эти зависимости для вашей конфигурации.

...