| @@ -0,0 +1,98 @@ | |||
| #!/usr/bin/env python3.6 | |||
| import math | |||
| import sys | |||
| import os | |||
| import xmltodict | |||
| #from pprint import pprint | |||
| from os.path import join, exists | |||
| from PIL import Image, ImageDraw | |||
| # find -iname \*.jp2 -exec opj_decompress -i {} -o {}.ppm \; | |||
| BASE_PATH = sys.argv[1] | |||
| ITEM_ID = sys.argv[2] | |||
| FILTER_PAGE_NR = None | |||
| if len(sys.argv) > 3: | |||
| # ex: 0020, or ANY | |||
| FILTER_PAGE_NR = sys.argv[3] | |||
| if len(sys.argv) > 4: | |||
| OUTPATH = sys.argv[4] | |||
| r = xmltodict.parse(open(join(BASE_PATH, ITEM_ID, ITEM_ID + '_scandata.xml'), 'rb')) | |||
| relevant = r['book']['pageData']['page'] | |||
| #pprint(relevant) | |||
| #PIL.ImageDraw.Draw.polygon(xy, fill=None, outline=None) | |||
| for r in relevant: | |||
| # Only want 'Normal' pagetype, for now | |||
| pagetype = r['pageType'] | |||
| if pagetype != 'Normal': | |||
| continue | |||
| orig_file_name = r['origFileName'] | |||
| rotation = int(r['rotateDegree']) | |||
| skew = float(r['skewAngle']) | |||
| apply_skew = r['skewActive'] | |||
| crop = r['cropBox'] | |||
| crop_x, crop_y, crop_w, crop_h = int(crop['x']), int(crop['y']), int(crop['w']), int(crop['h']) | |||
| if FILTER_PAGE_NR and FILTER_PAGE_NR != 'ANY' and orig_file_name[0:4] != FILTER_PAGE_NR: | |||
| continue | |||
| #print(pagetype, orig_file_name, rotation, skew, apply_skew, crop_x, crop_y, crop_w, crop_h) | |||
| skew_r = math.radians(-skew) | |||
| if apply_skew: | |||
| top_l = (crop_x, crop_y) | |||
| top_r = (crop_x + crop_w * math.cos(skew_r), crop_y + crop_w * math.sin(skew_r)) | |||
| bottom_l = (crop_x + crop_h * math.sin(skew_r), crop_y + crop_h * math.cos(skew_r)) | |||
| bottom_r = (top_r[0], bottom_l[1] + crop_w * math.sin(skew_r)) | |||
| else: | |||
| top_l = (crop_x, crop_y) | |||
| top_r = (crop_x + crop_w, crop_y) | |||
| bottom_l = (crop_x, crop_y + crop_h) | |||
| bottom_r = (top_r[0], bottom_l[1]) | |||
| coords = [str(int(x)) for x in top_l + top_r + bottom_r + bottom_l] | |||
| data = [ITEM_ID + '_orig_' + orig_file_name.replace('.jpg', '.jp2.ppm')] | |||
| data.extend(coords) | |||
| print(','.join(data)) | |||
| if OUTPATH: | |||
| outbase = join(OUTPATH, ITEM_ID) | |||
| if not exists(outbase): | |||
| os.makedirs(outbase) | |||
| i = Image.open(join(BASE_PATH + ITEM_ID, ITEM_ID + '_orig_jp2', ITEM_ID + '_orig_' + orig_file_name.replace('.jpg', '.jp2'))) | |||
| #i = Image.open(join(BASE_PATH + ITEM_ID, ITEM_ID + '_orig_jp2', ITEM_ID + '_orig_' + orig_file_name.replace('.jpg', '.jp2.ppm'))) | |||
| i = i.rotate(-rotation, expand=True) | |||
| iw, ih = i.size | |||
| p = join(outbase, orig_file_name).replace('.jpg', '.orig.jpg') | |||
| print(p) | |||
| isave=i.copy() | |||
| isave.thumbnail((iw/4, ih/4), Image.ANTIALIAS) | |||
| isave.save(p) | |||
| #i.save(p) | |||
| idraw = ImageDraw.Draw(i) | |||
| idraw.rectangle([0, 0, iw, ih], outline=0, fill=0) | |||
| idraw.polygon([top_l, top_r, bottom_r, bottom_l], outline=255, fill=255) | |||
| p = join(outbase, orig_file_name).replace('.jpg', '.coloured.jpg') | |||
| print(p) | |||
| isave=i.copy() | |||
| isave.thumbnail((iw/4, ih/4), Image.ANTIALIAS) | |||
| isave.save(p) | |||
| #i.save(p) | |||