Open thomasdn opened 3 years ago
pyhief-pillow-opener https://pypi.org/project/pyheif-pillow-opener/ seems like a fairly easy way.
See this example:
from PIL import Image
from pyheif_pillow_opener import register_heif_opener
register_heif_opener()
image = Image.open('test.heic')
image.load()
Thanks for bringing this to my attention.
Steps to add this to lazygal:
1) add a requirements.txt
to register lazygal dependencies (I use Debian and have not managed to do this before) and the new dependency pyheif-pillow-opener
2) add processing of .heif
files
3) sort out how to get metadata from those files and hope GExiv2
can do it
4) add test cases for all of this
I started on this. I made a requirements.txt and a Makefile to use it to build a venv.
requirements.txt:
pyheif-pillow-opener
genshi
Pillow
GLib
Makefile:
# Makefile
venv: venv/bin/activate
venv/bin/activate: requirements.txt
test -d venv || python3 -m venv venv
. venv/bin/activate
venv/bin/pip3 install wheel
venv/bin/pip3 install -Ur requirements.txt
touch venv/bin/activate
cleanvenv:
rm -rf venv
Some dependencies I could not find in PyPI so could not put in requirements.txt. I installed the following packages using apt (not sure of all of them are needed though):
build-essential
devscripts
gettext
liblocale-msgfmt-perl
intltool
intltool-debian
ffmpeg
pandoc
libgexiv2-2
libgexiv2-dev
exiv2
Then I make the venv, activate it. Then run ./setup.py test
and it fails missing some 'gi' module. I have not been able to locate this module and thus cannot continue.
(venv) (sigal@bullseye-debootstrap) (2021-07-16 09:47:33) [0]
~/git/lazygal$ ./setup.py test
running test
Traceback (most recent call last):
File "/home/sigal/git/lazygal/./setup.py", line 279, in <module>
setup(
File "/usr/lib/python3.9/distutils/core.py", line 148, in setup
dist.run_commands()
File "/usr/lib/python3.9/distutils/dist.py", line 966, in run_commands
self.run_command(cmd)
File "/usr/lib/python3.9/distutils/dist.py", line 985, in run_command
cmd_obj.run()
File "/home/sigal/git/lazygal/./setup.py", line 55, in run
import lazygaltest
File "/home/sigal/git/lazygal/lazygaltest/__init__.py", line 25, in <module>
from lazygal.sourcetree import Directory
File "/home/sigal/git/lazygal/lazygal/sourcetree.py", line 33, in <module>
from . import pathutils, make, metadata
File "/home/sigal/git/lazygal/lazygal/metadata.py", line 26, in <module>
import gi
ModuleNotFoundError: No module named 'gi'
However, I did make a patch that might enable support of HEIF/HEIC images using the pyheif_pillow_opener. But, alas, it has not been tested:
diff --git a/lazygal/eyecandy.py b/lazygal/eyecandy.py
index 2693888..0740dd9 100644
--- a/lazygal/eyecandy.py
+++ b/lazygal/eyecandy.py
@@ -18,6 +18,10 @@
import random
from PIL import Image, ImageChops, ImageFilter
+from pyheif_pillow_opener import register_heif_opener
+
+register_heif_opener()
+
class Color:
diff --git a/lazygal/genmedia.py b/lazygal/genmedia.py
index e75eb3a..4b06f40 100644
--- a/lazygal/genmedia.py
+++ b/lazygal/genmedia.py
@@ -23,6 +23,10 @@ from PIL import Image as PILImage
# lazygal has her own ImageFile class, so avoid trouble
from PIL import ImageFile as PILImageFile
PILImageFile.MAXBLOCK = 1024 * 1024 # default is 64k, not enough for big pics
+from pyheif_pillow_opener import register_heif_opener
+
+register_heif_opener()
+
from . import make
from . import genfile
diff --git a/lazygal/mediautils.py b/lazygal/mediautils.py
index c2f8ded..f988417 100644
--- a/lazygal/mediautils.py
+++ b/lazygal/mediautils.py
@@ -26,6 +26,10 @@ import tempfile
from PIL import Image as PILImage
+from pyheif_pillow_opener import register_heif_opener
+
+register_heif_opener()
+
class VideoError(Exception): pass
diff --git a/lazygal/sourcetree.py b/lazygal/sourcetree.py
index 4e366bc..f65ec16 100644
--- a/lazygal/sourcetree.py
+++ b/lazygal/sourcetree.py
@@ -25,6 +25,10 @@ import re
import time
from PIL import Image as PILImage
+from pyheif_pillow_opener import register_heif_opener
+
+register_heif_opener()
+
from . import pathutils, make, metadata
from . import mediautils
There will likely have to be done a bit of work in getting file name references correct. For example when reading a source file as filename.heic. Then I assume the thumbnail will be saved as jpg and thus the filename extension in the destination must be .jpg as well.
Of course, I have not done any work on bullets 3 and 4 in your list regarding metadata and test cases.
Sorry for not being able to contribute a fully working solution. I hope this is at least somewhat valuable.
Thanks a lot for this work.
For module gi
you need PyGObject
.
The other deps are for building manpages and translations.
I think register_heif_opener()
will be required only once. You'll also need to make lazygal
process .heif
files in lazygal/sourcetree.py
class MediaHandler
.
I added PyGObject to requirements.txt and finally made the venv work.
When I run setup.py test, I get a whole bunch of errors: https://paste.yt/p15612.html
I have not real idea how to solve these. I guess I am in a bit over my head here.
Your venv misses gi overrides (file /usr/lib/python3/dist-packages/gi/overrides/GExiv2.py
). I'm not familiar with venv and do not know how to fix this.
Would it be possible to use the patch I sent above? Not sure what else is needed or how to contribute what is needed?
Please submit a working pull request. Only one call to register_heif_opener()
should be required. Also please make this optional by catching ImportError
.
Lazygal does not seem to support HEIF images. HEIF Newer Apple devices such as iPhone or iPads take photos in the HEIF format[1]. These photos are using the .heic extension. Lazygal does not seem to include the .heic files in the generated gallery.
Lazygal seems to use the Pillow module for image manipulation. Pillow seems to support the HEIF format[2], so I see no reason that lazygal shouldn't automatically include .heic images present in the source folder.
The pyheif package seems to enable HEIF support with Pillow.