39 lines
1.3 KiB
Python
39 lines
1.3 KiB
Python
"""
|
|
Crop a question row from a rendered PDF page PNG.
|
|
|
|
Usage:
|
|
python crop_question_row.py <page_png> <x0> <y0> <x1> <y1> <out_png>
|
|
|
|
Coordinates are NORMALIZED (0.0-1.0) relative to page dimensions.
|
|
Add --padding 0.01 for extra border (default 0.005).
|
|
|
|
Example:
|
|
python crop_question_row.py page_005.png 0.0 0.12 1.0 0.22 2019_v1_a7.png
|
|
"""
|
|
import sys
|
|
import argparse
|
|
from PIL import Image
|
|
|
|
def crop(page_png, x0, y0, x1, y1, out_png, padding=0.005):
|
|
img = Image.open(page_png)
|
|
w, h = img.size
|
|
px0 = max(0, int((x0 - padding) * w))
|
|
py0 = max(0, int((y0 - padding) * h))
|
|
px1 = min(w, int((x1 + padding) * w))
|
|
py1 = min(h, int((y1 + padding) * h))
|
|
cropped = img.crop((px0, py0, px1, py1))
|
|
cropped.save(out_png)
|
|
print(f'Saved {out_png} ({cropped.width}x{cropped.height})')
|
|
|
|
if __name__ == '__main__':
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('page_png')
|
|
parser.add_argument('x0', type=float)
|
|
parser.add_argument('y0', type=float)
|
|
parser.add_argument('x1', type=float)
|
|
parser.add_argument('y1', type=float)
|
|
parser.add_argument('out_png')
|
|
parser.add_argument('--padding', type=float, default=0.005)
|
|
args = parser.parse_args()
|
|
crop(args.page_png, args.x0, args.y0, args.x1, args.y1, args.out_png, args.padding)
|