ImageConverter now uses generic context; #562
This commit is contained in:
parent
cbe79ee98c
commit
a3b2784f31
@ -1,3 +1,3 @@
|
||||
""" version info """
|
||||
|
||||
__version__ = "0.44.2"
|
||||
__version__ = "0.44.3"
|
||||
|
||||
@ -17,25 +17,25 @@ from wurlitzer import pipes
|
||||
|
||||
|
||||
class ImageConversionError(Exception):
|
||||
"""Base class for exceptions in this module. """
|
||||
"""Base class for exceptions in this module."""
|
||||
|
||||
pass
|
||||
|
||||
|
||||
class ImageConverter:
|
||||
""" Convert images to jpeg. This class is a singleton
|
||||
which will re-use the Core Image CIContext to avoid
|
||||
creating a new context for every conversion. """
|
||||
"""Convert images to jpeg. This class is a singleton
|
||||
which will re-use the Core Image CIContext to avoid
|
||||
creating a new context for every conversion."""
|
||||
|
||||
def __new__(cls, *args, **kwargs):
|
||||
""" create new object or return instance of already created singleton """
|
||||
"""create new object or return instance of already created singleton"""
|
||||
if not hasattr(cls, "instance") or not cls.instance:
|
||||
cls.instance = super().__new__(cls)
|
||||
|
||||
return cls.instance
|
||||
|
||||
def __init__(self):
|
||||
""" return existing singleton or create a new one """
|
||||
"""return existing singleton or create a new one"""
|
||||
|
||||
if hasattr(self, "context"):
|
||||
return
|
||||
@ -47,13 +47,10 @@ class ImageConverter:
|
||||
"workingFormat": Quartz.kCIFormatRGBAh,
|
||||
}
|
||||
)
|
||||
mtldevice = Metal.MTLCreateSystemDefaultDevice()
|
||||
self.context = Quartz.CIContext.contextWithMTLDevice_options_(
|
||||
mtldevice, context_options
|
||||
)
|
||||
self.context = Quartz.CIContext.contextWithOptions_(context_options)
|
||||
|
||||
def write_jpeg(self, input_path, output_path, compression_quality=1.0):
|
||||
""" convert image to jpeg and write image to output_path
|
||||
"""convert image to jpeg and write image to output_path
|
||||
|
||||
Args:
|
||||
input_path: path to input image (e.g. '/path/to/import/file.CR2') as str or pathlib.Path
|
||||
@ -104,8 +101,11 @@ class ImageConverter:
|
||||
if input_image is None:
|
||||
raise ImageConversionError(f"Could not create CIImage for {input_path}")
|
||||
|
||||
output_colorspace = input_image.colorSpace() or Quartz.CGColorSpaceCreateWithName(
|
||||
Quartz.CoreGraphics.kCGColorSpaceSRGB
|
||||
output_colorspace = (
|
||||
input_image.colorSpace()
|
||||
or Quartz.CGColorSpaceCreateWithName(
|
||||
Quartz.CoreGraphics.kCGColorSpaceSRGB
|
||||
)
|
||||
)
|
||||
|
||||
output_options = NSDictionary.dictionaryWithDictionary_(
|
||||
@ -123,4 +123,3 @@ class ImageConverter:
|
||||
raise ImageConversionError(
|
||||
f"Error converting file {input_path} to jpeg at {output_path}: {error}"
|
||||
)
|
||||
|
||||
|
||||
@ -2393,10 +2393,6 @@ def test_export_original_suffix_template():
|
||||
assert sorted(files) == sorted(CLI_EXPORT_FILENAMES_ORIGINAL_SUFFIX_TEMPLATE)
|
||||
|
||||
|
||||
@pytest.mark.skipif(
|
||||
"OSXPHOTOS_TEST_CONVERT" not in os.environ,
|
||||
reason="Skip if running in Github actions, no GPU.",
|
||||
)
|
||||
def test_export_convert_to_jpeg():
|
||||
"""test --convert-to-jpeg"""
|
||||
import glob
|
||||
@ -2420,10 +2416,6 @@ def test_export_convert_to_jpeg():
|
||||
assert large_file.stat().st_size > 7000000
|
||||
|
||||
|
||||
@pytest.mark.skipif(
|
||||
"OSXPHOTOS_TEST_CONVERT" not in os.environ,
|
||||
reason="Skip if running in Github actions, no GPU.",
|
||||
)
|
||||
def test_export_convert_to_jpeg_quality():
|
||||
"""test --convert-to-jpeg --jpeg-quality"""
|
||||
import glob
|
||||
@ -2455,10 +2447,6 @@ def test_export_convert_to_jpeg_quality():
|
||||
assert large_file.stat().st_size < 1000000
|
||||
|
||||
|
||||
@pytest.mark.skipif(
|
||||
"OSXPHOTOS_TEST_CONVERT" not in os.environ,
|
||||
reason="Skip if running in Github actions, no GPU.",
|
||||
)
|
||||
def test_export_convert_to_jpeg_skip_raw():
|
||||
"""test --convert-to-jpeg"""
|
||||
import glob
|
||||
@ -6678,10 +6666,6 @@ def test_export_jpeg_ext_edited_movie():
|
||||
assert f"{filename}_edited.{ext}".lower() in files
|
||||
|
||||
|
||||
@pytest.mark.skipif(
|
||||
"OSXPHOTOS_TEST_CONVERT" not in os.environ,
|
||||
reason="Skip if running in Github actions, no GPU.",
|
||||
)
|
||||
def test_export_jpeg_ext_convert_to_jpeg():
|
||||
"""test --jpeg-ext with --convert-to-jpeg"""
|
||||
import glob
|
||||
@ -6713,10 +6697,6 @@ def test_export_jpeg_ext_convert_to_jpeg():
|
||||
assert f"{filename}.jpg" in files
|
||||
|
||||
|
||||
@pytest.mark.skipif(
|
||||
"OSXPHOTOS_TEST_CONVERT" not in os.environ,
|
||||
reason="Skip if running in Github actions, no GPU.",
|
||||
)
|
||||
def test_export_jpeg_ext_convert_to_jpeg_movie():
|
||||
"""test --jpeg-ext with --convert-to-jpeg and a movie, shouldn't convert or change extensions, #366"""
|
||||
import glob
|
||||
|
||||
@ -4,11 +4,6 @@ import os
|
||||
|
||||
import pytest
|
||||
|
||||
skip_test = "OSXPHOTOS_TEST_CONVERT" not in os.environ
|
||||
pytestmark = pytest.mark.skipif(
|
||||
skip_test, reason="Skip if running on GitHub actions, no GPU."
|
||||
)
|
||||
|
||||
|
||||
TEST_HEIC = "tests/test-images/IMG_3092.heic"
|
||||
TEST_RAW = "tests/test-images/IMG_0476_2.CR2"
|
||||
@ -19,7 +14,7 @@ TEST_IMAGE_DOES_NOT_EXIST = "tests/test-images/NOT-A-FILE.heic"
|
||||
|
||||
|
||||
def test_image_converter_singleton():
|
||||
""" test that ImageConverter is a singleton """
|
||||
"""test that ImageConverter is a singleton"""
|
||||
from osxphotos.imageconverter import ImageConverter
|
||||
|
||||
convert1 = ImageConverter()
|
||||
@ -29,7 +24,7 @@ def test_image_converter_singleton():
|
||||
|
||||
|
||||
def test_image_converter():
|
||||
""" test conversion of different image types """
|
||||
"""test conversion of different image types"""
|
||||
import pathlib
|
||||
import tempfile
|
||||
from osxphotos.imageconverter import ImageConverter
|
||||
@ -50,7 +45,7 @@ def test_image_converter():
|
||||
|
||||
|
||||
def test_image_converter_compression_quality():
|
||||
""" test conversion of different image types with custom compression quality """
|
||||
"""test conversion of different image types with custom compression quality"""
|
||||
import pathlib
|
||||
import tempfile
|
||||
from osxphotos.imageconverter import ImageConverter
|
||||
@ -69,7 +64,7 @@ def test_image_converter_compression_quality():
|
||||
|
||||
|
||||
def test_image_converter_bad_compression_quality():
|
||||
""" test illegal compression quality """
|
||||
"""test illegal compression quality"""
|
||||
import pathlib
|
||||
import tempfile
|
||||
from osxphotos.imageconverter import ImageConverter
|
||||
@ -86,7 +81,7 @@ def test_image_converter_bad_compression_quality():
|
||||
|
||||
|
||||
def test_image_converter_bad_file():
|
||||
""" Try to convert a file that's not an image """
|
||||
"""Try to convert a file that's not an image"""
|
||||
import pathlib
|
||||
import tempfile
|
||||
from osxphotos.imageconverter import ImageConverter, ImageConversionError
|
||||
@ -101,7 +96,7 @@ def test_image_converter_bad_file():
|
||||
|
||||
|
||||
def test_image_converter_missing_file():
|
||||
""" Try to convert a file that's not an image """
|
||||
"""Try to convert a file that's not an image"""
|
||||
import pathlib
|
||||
import tempfile
|
||||
from osxphotos.imageconverter import ImageConverter
|
||||
@ -113,4 +108,3 @@ def test_image_converter_missing_file():
|
||||
outfile = pathlib.Path(tempdir.name) / f"{imgfile.stem}.jpeg"
|
||||
with pytest.raises(FileNotFoundError):
|
||||
converter.write_jpeg(imgfile, outfile)
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user