init
This commit is contained in:
commit
8f379f3b69
157
ex2.py
Normal file
157
ex2.py
Normal file
@ -0,0 +1,157 @@
|
||||
import os.path
|
||||
from enum import Enum
|
||||
from glob import glob
|
||||
from typing import TextIO
|
||||
|
||||
import PIL
|
||||
from PIL import Image, ImageStat
|
||||
|
||||
|
||||
def mkdirIfNotExists(path: str):
|
||||
if not os.path.isdir(path):
|
||||
print(f"creating folder: {path}")
|
||||
os.makedirs(path)
|
||||
|
||||
|
||||
def validSuffix(file: str) -> bool:
|
||||
return file.endswith((".jpg", ".jpeg", ".JPG"))
|
||||
|
||||
|
||||
def validFileSize(file: str) -> bool:
|
||||
return os.path.getsize(file) < 250_000
|
||||
|
||||
|
||||
class ErrorCodes(Enum):
|
||||
Extension = 1
|
||||
FileSize = 2
|
||||
InvalidImage = 3
|
||||
ImageShape = 4
|
||||
VarianceLZero = 5
|
||||
Duplicate = 6
|
||||
|
||||
|
||||
def log(filename: str, errorCode: ErrorCodes):
|
||||
print(f"[{filename}] :: {errorCode}")
|
||||
|
||||
|
||||
class Singleton(type):
|
||||
_instances = {}
|
||||
|
||||
def __call__(cls, *args, **kwargs):
|
||||
if cls not in cls._instances:
|
||||
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
|
||||
return cls._instances[cls]
|
||||
|
||||
|
||||
class FileLogger(metaclass=Singleton):
|
||||
file: TextIO or None = None
|
||||
|
||||
def init(self, log_file_path: str):
|
||||
self.file = open(log_file_path, 'a')
|
||||
|
||||
def close(self):
|
||||
self.file.close()
|
||||
|
||||
def log(self, filename: str, errorcode: ErrorCodes):
|
||||
self.file.write(f"{filename},{errorcode.value}\n")
|
||||
|
||||
|
||||
def openImage(path: str) -> PIL.Image.Image or None:
|
||||
try:
|
||||
return Image.open(path)
|
||||
except (FileNotFoundError, PIL.UnidentifiedImageError, ValueError, TypeError) as e:
|
||||
return None
|
||||
|
||||
|
||||
def validImageShape(img: PIL.Image.Image) -> bool:
|
||||
# check read mode of channels
|
||||
if img.mode != "RGB":
|
||||
return False
|
||||
|
||||
# check if nr and order of channels is correct
|
||||
if img.getbands() != ('R', 'G', 'B'):
|
||||
return False
|
||||
|
||||
# check if file format is jepeg
|
||||
if img.format != "JPEG":
|
||||
return False
|
||||
|
||||
# check if height and length is > 96
|
||||
if img.height <= 96 or img.width <= 96:
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def validVariance(img: PIL.Image.Image) -> bool:
|
||||
variances = ImageStat.Stat(img).var
|
||||
# variance cannot be negative!
|
||||
return min(variances) > .0
|
||||
|
||||
|
||||
def processFile(f: str):
|
||||
# check suffix
|
||||
if not validSuffix(f):
|
||||
log(f, ErrorCodes.Extension)
|
||||
FileLogger().log(f, ErrorCodes.Extension)
|
||||
return
|
||||
|
||||
# check file size
|
||||
if not validFileSize(f):
|
||||
log(f, ErrorCodes.FileSize)
|
||||
FileLogger().log(f, ErrorCodes.FileSize)
|
||||
return
|
||||
|
||||
img = openImage(f)
|
||||
if img is None:
|
||||
log(f, ErrorCodes.InvalidImage)
|
||||
FileLogger().log(f, ErrorCodes.InvalidImage)
|
||||
return
|
||||
|
||||
if not validImageShape(img):
|
||||
log(f, ErrorCodes.ImageShape)
|
||||
FileLogger().log(f, ErrorCodes.ImageShape)
|
||||
return
|
||||
|
||||
if not validVariance(img):
|
||||
log(f, ErrorCodes.VarianceLZero)
|
||||
FileLogger().log(f, ErrorCodes.VarianceLZero)
|
||||
return
|
||||
|
||||
# lets copy the image data
|
||||
# todo check if image has already be copied
|
||||
|
||||
# close image
|
||||
img.close()
|
||||
|
||||
|
||||
def findFiles(path: str) -> [str]:
|
||||
files = glob(path + '/**/*', recursive=True)
|
||||
print(files)
|
||||
|
||||
# sort filenames
|
||||
files.sort()
|
||||
|
||||
for f in files:
|
||||
processFile(f)
|
||||
|
||||
|
||||
def validate_images(input_dir: str, output_dir: str, log_file: str, formatter: str or None = None):
|
||||
# check if out_put dir exists
|
||||
mkdirIfNotExists(output_dir)
|
||||
|
||||
# check if logfile dir exists
|
||||
logdir = os.path.dirname(log_file)
|
||||
mkdirIfNotExists(logdir)
|
||||
|
||||
# init file logger
|
||||
FileLogger().init(log_file)
|
||||
|
||||
# scan input dir for files
|
||||
findFiles(input_dir)
|
||||
pass
|
||||
|
||||
|
||||
# Press the green button in the gutter to run the script.
|
||||
if __name__ == '__main__':
|
||||
validate_images("./input", "./output", "logs/1/log.txt")
|
7
main.py
Normal file
7
main.py
Normal file
@ -0,0 +1,7 @@
|
||||
# This is a sample Python script.
|
||||
|
||||
# Press Umschalt+F10 to execute it or replace it with your code.
|
||||
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
|
||||
|
||||
|
||||
# See PyCharm help at https://www.jetbrains.com/help/pycharm/
|
Loading…
Reference in New Issue
Block a user