obracanie zdjęcia fix

This commit is contained in:
Mateusz Gruszczyński
2025-07-22 14:19:24 +02:00
parent 258d111133
commit 78fcdce327

55
app.py
View File

@@ -267,37 +267,30 @@ def enrich_list_data(l):
def save_resized_image(file, path):
try:
# Otwórz i sprawdź poprawność pliku
image = Image.open(file)
image.verify()
file.seek(0)
image = Image.open(file)
image.verify() # sprawdzenie poprawności pliku
file.seek(0) # reset do początku
image = Image.open(file) # ponowne otwarcie po verify()
except Exception:
raise ValueError("Nieprawidłowy plik graficzny")
# Obrót na podstawie EXIF
try:
exif = image._getexif()
if exif:
orientation_key = next(
k for k, v in ExifTags.TAGS.items() if v == "Orientation"
)
orientation = exif.get(orientation_key)
if orientation == 3:
image = image.rotate(180, expand=True)
elif orientation == 6:
image = image.rotate(270, expand=True)
elif orientation == 8:
image = image.rotate(90, expand=True)
# Automatyczna rotacja według EXIF (np. zdjęcia z telefonu)
image = ImageOps.exif_transpose(image)
except Exception:
pass # brak lub błędny EXIF
pass # ignorujemy, jeśli EXIF jest uszkodzony lub brak
image.thumbnail((2000, 2000))
image = image.convert("RGB")
image.info.clear()
try:
image.thumbnail((2000, 2000))
image = image.convert("RGB")
image.info.clear()
new_path = path.rsplit(".", 1)[0] + ".webp"
image.save(new_path, format="WEBP", quality=100, method=0)
except Exception as e:
raise ValueError(f"Błąd podczas przetwarzania obrazu: {e}")
new_path = path.rsplit(".", 1)[0] + ".webp"
#image.save(new_path, format="WEBP", quality=85, method=6)
image.save(new_path, format="WEBP", quality=100, method=0)
def redirect_with_flash(
message: str, category: str = "info", endpoint: str = "main_page"
@@ -344,12 +337,16 @@ def _receipt_error(message):
############# OCR ###########################
def preprocess_image_for_tesseract(image):
image = ImageOps.autocontrast(image)
image = image.point(lambda x: 0 if x < 150 else 255) # mocniejsza binarizacja
image = image.resize((image.width * 2, image.height * 2), Image.BICUBIC) # większe powiększenie
image = image.resize(
(image.width * 2, image.height * 2), Image.BICUBIC
) # większe powiększenie
return image
def extract_total_tesseract(image):
text = pytesseract.image_to_string(image, lang="pol", config="--psm 4")
lines = text.splitlines()
@@ -371,7 +368,7 @@ def extract_total_tesseract(image):
amount
)\b
""",
re.IGNORECASE | re.VERBOSE
re.IGNORECASE | re.VERBOSE,
)
for idx, line in enumerate(lines):
@@ -420,9 +417,7 @@ def extract_total_tesseract(image):
continue
preferred = [
(val, line)
for val, line in candidates
if keyword_pattern.search(line.lower())
(val, line) for val, line in candidates if keyword_pattern.search(line.lower())
]
if preferred:
@@ -433,7 +428,9 @@ def extract_total_tesseract(image):
max_val = max([val for val, _ in candidates])
return round(max_val, 2), lines
data = pytesseract.image_to_data(image, lang="pol", config="--psm 4", output_type=Output.DICT)
data = pytesseract.image_to_data(
image, lang="pol", config="--psm 4", output_type=Output.DICT
)
font_candidates = []
for i in range(len(data["text"])):