Working state, mostly…
This commit is contained in:
+71
-63
@@ -199,6 +199,75 @@ def render_latex_text(text, width_px, bg_color=(255, 255, 255, 255), max_lines=N
|
||||
final_img.alpha_composite(img)
|
||||
return final_img
|
||||
|
||||
def add_local_fb(fb, draw, final_img, hmin, image_offset_y, last_text_bottom):
|
||||
# raw_pos = fb.get('pos')
|
||||
box = fb.get('box_2d')
|
||||
if not box or len(box) < 4:
|
||||
return
|
||||
|
||||
ymin, xmin, ymax, xmax = box[0], box[1], box[2], box[3]
|
||||
|
||||
target_ymin = (ymin - hmin) + image_offset_y
|
||||
target_ymax = (ymax - hmin) + image_offset_y
|
||||
target_xmin = xmin + MARGIN_LEFT
|
||||
target_xmax = xmax + MARGIN_LEFT
|
||||
|
||||
# Draw Rectangle
|
||||
draw.rectangle([target_xmin, target_ymin, target_xmax, target_ymax], outline="red", width=3)
|
||||
|
||||
# Render Text with transparent red background
|
||||
# (255, 0, 0, 50) is transparent red
|
||||
txt_img = render_latex_text(
|
||||
fb['text'],
|
||||
width_px=ANNOT_WIDTH,
|
||||
bg_color=(255, 200, 200, 180), # Light Red semi-transparent
|
||||
max_lines=3
|
||||
)
|
||||
|
||||
# Calculate placement
|
||||
txt_h = txt_img.height
|
||||
center_y = (target_ymin + target_ymax) / 2
|
||||
paste_y = center_y - (txt_h / 2)
|
||||
|
||||
paste_y = max(paste_y, image_offset_y)
|
||||
|
||||
# Prevent overlap with previous text
|
||||
if paste_y < last_text_bottom:
|
||||
paste_y = last_text_bottom + 5 # Move down + padding
|
||||
|
||||
# Check for overflow and resize if necessary
|
||||
required_height = int(paste_y + txt_h + 20) # +20 for bottom padding
|
||||
if required_height > final_img.height:
|
||||
# Create a new taller image
|
||||
new_final = Image.new("RGB", (final_img.width, required_height), "white")
|
||||
# Paste the current image content onto the new one
|
||||
new_final.paste(final_img, (0, 0))
|
||||
final_img = new_final
|
||||
# Re-initialize the draw object for the new image so subsequent rectangles are drawn correctly
|
||||
draw = ImageDraw.Draw(final_img, "RGBA")
|
||||
|
||||
|
||||
# Paste in the left margin
|
||||
final_img.paste(txt_img, (10, int(paste_y)), mask=txt_img)
|
||||
last_text_bottom = paste_y + txt_h
|
||||
return (draw, final_img, last_text_bottom)
|
||||
|
||||
def make_base_image(pdf_path):
|
||||
pages = convert_from_path(pdf_path)
|
||||
|
||||
# Calculate total dimensions
|
||||
total_h = sum(page.height for page in pages)
|
||||
max_w = max(page.width for page in pages)
|
||||
|
||||
# Create concatenated base image
|
||||
base_img = Image.new("RGBA", (max_w, total_h), "white")
|
||||
|
||||
current_y = 0
|
||||
for page in pages:
|
||||
base_img.paste(page.convert("RGBA"), (0, current_y))
|
||||
current_y += page.height
|
||||
return (base_img, total_h, max_w)
|
||||
|
||||
def process_correction(root_dir, data, all_labels, overwrite=False):
|
||||
for student_id, labels in data.items():
|
||||
|
||||
@@ -234,19 +303,7 @@ def process_correction(root_dir, data, all_labels, overwrite=False):
|
||||
|
||||
# 2. Convert PDF to Image
|
||||
try:
|
||||
pages = convert_from_path(pdf_full_path)
|
||||
|
||||
# Calculate total dimensions
|
||||
total_h = sum(page.height for page in pages)
|
||||
max_w = max(page.width for page in pages)
|
||||
|
||||
# Create concatenated base image
|
||||
base_img = Image.new("RGBA", (max_w, total_h), "white")
|
||||
|
||||
current_y = 0
|
||||
for page in pages:
|
||||
base_img.paste(page.convert("RGBA"), (0, current_y))
|
||||
current_y += page.height
|
||||
(base_img, total_h, max_w) = annotating.make_base_image(pdf_full_path)
|
||||
except Exception as e:
|
||||
print(f"Error converting {pdf_full_path}: {e}")
|
||||
continue
|
||||
@@ -305,56 +362,7 @@ def process_correction(root_dir, data, all_labels, overwrite=False):
|
||||
last_text_bottom = 0
|
||||
|
||||
for fb in local_fb:
|
||||
# raw_pos = fb.get('pos')
|
||||
box = fb.get('box_2d')
|
||||
if not box or len(box) < 4:
|
||||
continue
|
||||
|
||||
ymin, xmin, ymax, xmax = box[0], box[1], box[2], box[3]
|
||||
|
||||
target_ymin = (ymin - hmin) + image_offset_y
|
||||
target_ymax = (ymax - hmin) + image_offset_y
|
||||
target_xmin = xmin + MARGIN_LEFT
|
||||
target_xmax = xmax + MARGIN_LEFT
|
||||
|
||||
# Draw Rectangle
|
||||
draw.rectangle([target_xmin, target_ymin, target_xmax, target_ymax], outline="red", width=3)
|
||||
|
||||
# Render Text with transparent red background
|
||||
# (255, 0, 0, 50) is transparent red
|
||||
txt_img = render_latex_text(
|
||||
fb['text'],
|
||||
width_px=ANNOT_WIDTH,
|
||||
bg_color=(255, 200, 200, 180), # Light Red semi-transparent
|
||||
max_lines=3
|
||||
)
|
||||
|
||||
# Calculate placement
|
||||
txt_h = txt_img.height
|
||||
center_y = (target_ymin + target_ymax) / 2
|
||||
paste_y = center_y - (txt_h / 2)
|
||||
|
||||
paste_y = max(paste_y, image_offset_y)
|
||||
|
||||
# Prevent overlap with previous text
|
||||
if paste_y < last_text_bottom:
|
||||
paste_y = last_text_bottom + 5 # Move down + padding
|
||||
|
||||
# Check for overflow and resize if necessary
|
||||
required_height = int(paste_y + txt_h + 20) # +20 for bottom padding
|
||||
if required_height > final_img.height:
|
||||
# Create a new taller image
|
||||
new_final = Image.new("RGB", (final_img.width, required_height), "white")
|
||||
# Paste the current image content onto the new one
|
||||
new_final.paste(final_img, (0, 0))
|
||||
final_img = new_final
|
||||
# Re-initialize the draw object for the new image so subsequent rectangles are drawn correctly
|
||||
draw = ImageDraw.Draw(final_img, "RGBA")
|
||||
|
||||
|
||||
# Paste in the left margin
|
||||
final_img.paste(txt_img, (10, int(paste_y)), mask=txt_img)
|
||||
last_text_bottom = paste_y + txt_h
|
||||
(draw, final_img, last_text_bottom) = add_local_fb(fb, draw, final_img, hmin, image_offset_y, last_text_bottom)
|
||||
|
||||
# 7. Save Image
|
||||
save_path = os.path.join(output_dir, f"{label}.jpg")
|
||||
|
||||
Reference in New Issue
Block a user