|
|
@@ -6,13 +6,13 @@ import multiprocessing
|
|
|
from datetime import datetime as dt
|
|
|
from PIL import Image
|
|
|
import piexif
|
|
|
-import re
|
|
|
import math
|
|
|
import yaml
|
|
|
from dataclasses import dataclass
|
|
|
|
|
|
from typing import Optional
|
|
|
|
|
|
+# Requires pip install piexif, pillow, pyyaml
|
|
|
|
|
|
@dataclass
|
|
|
class OutputDef:
|
|
|
@@ -25,7 +25,7 @@ class OutputDef:
|
|
|
|
|
|
|
|
|
SocialMediaDef = OutputDef(1600, 1080, "JPEG", 96, "sm", "_sm.jpg")
|
|
|
-HqDef = OutputDef(2560, 1920, "JPEG", 95, "hq", "_hq.jpg")
|
|
|
+HqDef = OutputDef(2560, 1920, "JPEG", 98, "hq", "_hq.jpg")
|
|
|
FullDef = OutputDef(3600, 2700, "JPEG", 98, "full", "_full.jpg")
|
|
|
|
|
|
# --------
|
|
|
@@ -35,9 +35,10 @@ _verbose = False
|
|
|
WmScale = 1.6
|
|
|
|
|
|
class Config:
|
|
|
- def __init__(self, yaml_filename:str):
|
|
|
- with open(yaml_filename) as f:
|
|
|
- cfg = yaml.load(f.read(), Loader=yaml.SafeLoader)
|
|
|
+ def __init__(self, yaml_filename:str):
|
|
|
+ with open(yaml_filename) as f:
|
|
|
+ cfg = yaml.safe_load(f)
|
|
|
+ #cfg = yaml.safload(f.read(), Loader=yaml.SafeLoader)
|
|
|
self.CfgDict:dict = cfg
|
|
|
self.Copyright:str = cfg["Copyright"]
|
|
|
self.UserComment:str = cfg["UserComment"]
|
|
|
@@ -186,20 +187,24 @@ class Watermark:
|
|
|
main_image.paste(watermark, (wm_x, wm_y), watermark)
|
|
|
|
|
|
|
|
|
-def makeExifDict(copyright, usercomment) -> bytes:
|
|
|
- exif_dict = {
|
|
|
- "0th": {
|
|
|
- piexif.ImageIFD.Copyright: copyright.encode("ascii")
|
|
|
- },
|
|
|
- "Exif": {
|
|
|
- piexif.ExifIFD.UserComment: b"ASCII\0\0\0" + usercomment.encode('ascii')
|
|
|
- },
|
|
|
+def makeExifBytes(copyright:Optional[str], user_comment:Optional[str], image_description:Optional[str]) -> bytes:
|
|
|
+ exif = {
|
|
|
+ "0th": {},
|
|
|
+ "Exif": {},
|
|
|
"GPS": {},
|
|
|
"1st": {},
|
|
|
"thumbnail": None
|
|
|
}
|
|
|
|
|
|
- return piexif.dump(exif_dict)
|
|
|
+ if copyright is not None:
|
|
|
+ exif["0th"][piexif.ImageIFD.Copyright] = copyright.encode("ascii")
|
|
|
+ if user_comment is not None:
|
|
|
+ # = b'\0\0\0\0\0\0\0\0' + user_comment.encode('utf-8')
|
|
|
+ exif["Exif"][piexif.ExifIFD.UserComment] = b"ASCII\0\0\0" + user_comment.encode('ascii')
|
|
|
+ if image_description is not None:
|
|
|
+ exif['0th'][piexif.ImageIFD.ImageDescription] = image_description.encode('utf-8')
|
|
|
+
|
|
|
+ return piexif.dump(exif)
|
|
|
|
|
|
def resizeSaveOutput(input_filename:str, out_name:str, img:Image, exif_bytes:bytes, output_def:OutputDef):
|
|
|
|
|
|
@@ -252,7 +257,7 @@ def process_image(main_image_path:str, watermark:Watermark):
|
|
|
|
|
|
print("Input: %s, (year: %d to be used for copyright notice)" % (main_image_path, year))
|
|
|
|
|
|
- exif = makeExifDict(_config.Copyright % year, _config.UserComment)
|
|
|
+ exif = makeExifBytes(_config.Copyright % year, _config.UserComment, img_cfg.get("title"))
|
|
|
|
|
|
# Load the main image
|
|
|
main_image = Image.open(main_image_path)
|