78 lines
2.4 KiB
Python
78 lines
2.4 KiB
Python
import re
|
|
from typing import List, Optional, Tuple
|
|
from PIL import Image
|
|
from sys import stderr
|
|
|
|
|
|
WIDTH = 256
|
|
HEIGHT = 257
|
|
KEY = 42016
|
|
|
|
class VizComMatrix:
|
|
@classmethod
|
|
def solve_image(cls, path: str, metadata: dict) -> Optional[Image.Image]:
|
|
orig = Image.open(path) # type: Image.Image
|
|
new_size = (orig.size[0] - 90, orig.size[1] - 140)
|
|
ref = Image.new(orig.mode, new_size) # type: Image.Image
|
|
ref.paste(orig)
|
|
|
|
exif = orig._getexif()
|
|
if KEY in exif:
|
|
key = [int(i, 16) for i in exif[KEY].split(':')]
|
|
width, height = exif[WIDTH], exif[HEIGHT]
|
|
else:
|
|
key = []
|
|
width, height = metadata['width'], metadata['height']
|
|
small_width = int(width / 10)
|
|
small_height = int(height / 15)
|
|
|
|
cls.paste(ref, orig, (
|
|
0, small_height + 10,
|
|
small_width, height - 2 * small_height,
|
|
), (
|
|
0, small_height,
|
|
small_width, height - 2 * small_height,
|
|
))
|
|
|
|
cls.paste(ref, orig, (
|
|
0, 14 * (small_height + 10),
|
|
width, orig.height - 14 * (small_height + 10),
|
|
), (
|
|
0, 14 * small_height,
|
|
width, orig.height - 14 * (small_height + 10),
|
|
))
|
|
|
|
cls.paste(ref, orig, (
|
|
9 * (small_width + 10), small_height + 10,
|
|
small_width + (width - 10 * small_width), height - 2 * small_height,
|
|
), (
|
|
9 * small_width, small_height,
|
|
small_width + (width - 10 * small_width), height - 2 * small_height,
|
|
))
|
|
|
|
for i, j in enumerate(key):
|
|
cls.paste(ref, orig, (
|
|
(i % 8 + 1) * (small_width + 10), (int(i / 8) + 1) * (small_height + 10),
|
|
small_width, small_height,
|
|
), (
|
|
(j % 8 + 1) * small_width, (int(j / 8) + 1) * small_height,
|
|
small_width, small_height,
|
|
))
|
|
|
|
return ref
|
|
|
|
@classmethod
|
|
def paste(cls, ref: Image.Image, orig: Image.Image, orig_box: Tuple, ref_box: Tuple):
|
|
ref.paste(orig.crop((
|
|
int(orig_box[0]), int(orig_box[1]),
|
|
int(orig_box[0] + orig_box[2]), int(orig_box[1] + orig_box[3]),
|
|
)), (
|
|
int(ref_box[0]), int(ref_box[1]),
|
|
int(ref_box[0] + ref_box[2]), int(ref_box[1] + ref_box[3]),
|
|
))
|
|
|
|
|
|
solve = VizComMatrix().solve_image
|
|
|
|
__all__ = ['solve']
|