File size: 2,608 Bytes
c843d82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#!/usr/bin/env python3
"""
Developed by Nikhil Nageshwar Inturi

This module provides TiffToPngConverter for converting TIFF images to PNG format,
applying a scaling factor to resize the images.
"""

# imports
import logging, tifffile
from pathlib import Path
from typing import Union
from PIL import Image
# local imports
from utils.constants import *


class TiffToPngConverter:
    """
    Converts all TIFF images in a source directory to PNG format,
    applying a scaling factor to resize the images.
    """

    def __init__(self, scaling_factor: float, tif_dir: Union[str, Path], output_dir: Union[str, Path]) -> None:
        self.scaling_factor = scaling_factor
        self.tif_dir = Path(tif_dir)
        self.output_dir = Path(output_dir)
        self.logger = logging.getLogger(self.__class__.__name__)
        self._setup_output_directory()

    def _setup_output_directory(self) -> None:
        try:
            self.output_dir.mkdir(parents=True, exist_ok=True)
            self.logger.debug(f"Output directory ready: {self.output_dir}")
        except Exception as e:
            self.logger.error(f"Failed to create output directory {self.output_dir}: {e}")
            raise

    def convert_all(self) -> None:
        """
        Convert all .tif files in the source directory.
        """
        tif_files = list(self.tif_dir.glob("*.tif"))
        if not tif_files:
            self.logger.warning(f"No .tif files found in {self.tif_dir}")
            return

        for tif_path in tif_files:
            try:
                self.convert_file(tif_path)
            except Exception:
                self.logger.exception(f"Error converting file: {tif_path}")

    def convert_file(self, tif_path: Path) -> None:
        """
        Convert a single TIFF file to PNG, resizing by the scaling factor.

        Args:
            tif_path: Path to the input .tif file.
        """
        img_array = tifffile.imread(str(tif_path), level=0)
        self.logger.debug(f"Read {tif_path.name} with shape {img_array.shape}")
        img = Image.fromarray(img_array)
        new_size = (int(img_array.shape[1] * self.scaling_factor), int(img_array.shape[0] * self.scaling_factor))
        img_resized = img.resize(new_size, resample=Image.LANCZOS)
        output_path = self.output_dir / tif_path.with_suffix(".png").name
        img_resized.save(output_path, format="PNG")
        self.logger.info(f"Converted {tif_path.name} to {output_path}")


# testing
# setup_logging(logging.INFO)
# converter = TiffToPngConverter(0.2125, 'path/to/tifs', 'path/to/output')
# converter.convert_all()