From 145de3311cb9f32ac0bc9842b0600fcad84fed16 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Fri, 9 May 2025 21:58:54 -0500 Subject: add support for downloading new images from immich api on a separate thread --- texture.py | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 texture.py (limited to 'texture.py') diff --git a/texture.py b/texture.py new file mode 100644 index 0000000..cf37d6a --- /dev/null +++ b/texture.py @@ -0,0 +1,43 @@ +from OpenGL.GL import * +from OpenGL.GLUT import * +from OpenGL.GLU import * +from PIL import Image, ExifTags + +class ImageTexture: + def __init__(self, image_source, exif=None): + self.id = None + img = Image.open(image_source) + self.exif = exif or ImageTexture.get_exif(img) + img = ImageTexture.handle_orientation(img, exif) + img = img.convert("RGBA") # Ensure the image is in RGBA mode + self.width = img.width + self.height = img.height + self._img_data = img.tobytes("raw", "RGBA", 0, -1) # Convert image data to bytes + + def gl_init(self): + if self.id: + return + #glPixelStorei(GL_UNPACK_ALIGNMENT, 1) + self.id = glGenTextures(1) + glBindTexture(GL_TEXTURE_2D, self.id) + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, self.width, self.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, self._img_data) + #glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img.width, img.height, 0, GL_RGB, GL_UNSIGNED_BYTE, img_data) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR) + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) + del self._img_data # No longer needed, clear mem + + print(f"Loaded texture {self.id}") + + @staticmethod + def get_exif(img): + return { ExifTags.TAGS[k]: v for k, v in img.getexif().items() if k in ExifTags } + + @staticmethod + def handle_orientation(img, exif): + orientation = exif.get("Orientation", 1) + + if orientation == 3: return img.rotate(180, expand=True) + if orientation == 6: return img.rotate(270, expand=True) + if orientation == 8: return img.rotate( 90, expand=True) + + return img -- cgit v1.2.3 From 568a87f44a674276e6e55f9302cc9e44a0929f71 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Fri, 9 May 2025 22:04:15 -0500 Subject: get exif correctly --- texture.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'texture.py') diff --git a/texture.py b/texture.py index cf37d6a..73b7a84 100644 --- a/texture.py +++ b/texture.py @@ -8,7 +8,7 @@ class ImageTexture: self.id = None img = Image.open(image_source) self.exif = exif or ImageTexture.get_exif(img) - img = ImageTexture.handle_orientation(img, exif) + img = ImageTexture.handle_orientation(img, self.exif) img = img.convert("RGBA") # Ensure the image is in RGBA mode self.width = img.width self.height = img.height @@ -30,11 +30,11 @@ class ImageTexture: @staticmethod def get_exif(img): - return { ExifTags.TAGS[k]: v for k, v in img.getexif().items() if k in ExifTags } + return { ExifTags.TAGS[k]: v for k, v in img.getexif().items() if k in ExifTags.TAGS } @staticmethod def handle_orientation(img, exif): - orientation = exif.get("Orientation", 1) + orientation = exif.get("Orientation", 1) if exif is not None else 1 if orientation == 3: return img.rotate(180, expand=True) if orientation == 6: return img.rotate(270, expand=True) -- cgit v1.2.3 From 3aed05a6cb265e4f60a17f87eb368fb33c93a562 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Sat, 10 May 2025 16:26:33 -0500 Subject: cleanup some --- texture.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'texture.py') diff --git a/texture.py b/texture.py index 73b7a84..ebd1a49 100644 --- a/texture.py +++ b/texture.py @@ -7,8 +7,8 @@ class ImageTexture: def __init__(self, image_source, exif=None): self.id = None img = Image.open(image_source) - self.exif = exif or ImageTexture.get_exif(img) - img = ImageTexture.handle_orientation(img, self.exif) + self.exif = exif or self.get_exif(img) + img = self.handle_orientation(img, self.exif) img = img.convert("RGBA") # Ensure the image is in RGBA mode self.width = img.width self.height = img.height -- cgit v1.2.3 From e1a6fc09afc088dcb67263ed5923f5be41c32c31 Mon Sep 17 00:00:00 2001 From: Tim Keller Date: Sun, 25 May 2025 21:38:37 -0500 Subject: use lazy caching texture list to limit number of images loaded at one time --- texture.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'texture.py') diff --git a/texture.py b/texture.py index ebd1a49..3a56b5f 100644 --- a/texture.py +++ b/texture.py @@ -3,6 +3,7 @@ from OpenGL.GLUT import * from OpenGL.GLU import * from PIL import Image, ExifTags + class ImageTexture: def __init__(self, image_source, exif=None): self.id = None @@ -13,6 +14,7 @@ class ImageTexture: self.width = img.width self.height = img.height self._img_data = img.tobytes("raw", "RGBA", 0, -1) # Convert image data to bytes + self.initialized = True def gl_init(self): if self.id: @@ -26,7 +28,14 @@ class ImageTexture: glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR) del self._img_data # No longer needed, clear mem - print(f"Loaded texture {self.id}") + #print(f"Loaded texture {self.id}") + + def free(self): + if self.id is None: + del self._img_data + else: + glBindTexture(GL_TEXTURE_2D, 0) # Unbind + glDeleteTextures([self.id]) @staticmethod def get_exif(img): @@ -41,3 +50,18 @@ class ImageTexture: if orientation == 8: return img.rotate( 90, expand=True) return img + + +class ImageTextureImmichAsset(ImageTexture): + def __init__(self, asset, asset_index): + self.initialized = False + self.asset_index = asset_index + self.asset_key = asset["id"] + self.exif = asset.get("exif", None) + + # So that free can work + self.id = None + self._img_data = None + + def initialize(self, image_source): + super().__init__(image_source, self.exif) -- cgit v1.2.3