ComicMTL / backend /module /utils /manage_image.py
BloodyInside's picture
firsty
947c08e
import os
from PIL import Image
def merge_images_vertically(input_dir, output_dir, max_size=10 * 1024 * 1024):
os.makedirs(output_dir,exist_ok=True)
filenames = sorted(os.listdir(input_dir), key=lambda x: int(x.split(".")[0]))
merged_image = None
merged_file_index = 0
index = 0
while True:
if index > (len(filenames)-1): break
file = filenames[index]
if not merged_image:
image = Image.open(os.path.join(input_dir, file))
width, height = image.size
new_image = Image.new("RGB", (width, height))
# Paste the two images onto the new image
new_image.paste(image, (0, 0))
merged_image = new_image
index += 1
else:
merged_width, merged_height = merged_image.size
merged_image.save(os.path.join(output_dir, "temp.png"))
file_size = os.stat(os.path.join(output_dir, "temp.png")).st_size
if file_size >= max_size:
output_path = os.path.join(output_dir, f"{merged_file_index}.png")
if os.path.exists(output_path): os.remove(output_path)
os.rename(os.path.join(output_dir, "temp.png"), output_path)
merged_image = None
merged_file_index += 1
else:
image = Image.open(os.path.join(input_dir, file))
width, height = image.size
# Create a new image with the combined width and the height of the tallest image
new_width = max(merged_width, width)
new_height = merged_height + height
new_image = Image.new("RGB", (new_width, new_height))
# Paste the two images onto the new image
new_image.paste(merged_image, (0, 0))
new_image.paste(image, (0, merged_height))
merged_image = new_image
index += 1
if merged_image:
temp_path = os.path.join(output_dir, "temp.png")
if os.path.exists(temp_path): os.remove(temp_path)
merged_image.save(os.path.join(output_dir, f"{merged_file_index}.png"))
def split_image_vertically(input_dir, output_dir):
os.makedirs(output_dir,exist_ok=True)
filenames = sorted(os.listdir(input_dir), key=lambda x: int(x.split(".")[0]))
file_index = 0
for file in filenames:
cropped_height = 0
while True:
merged_translated_image = Image.open(os.path.join(input_dir, file))
max_width = merged_translated_image.width
max_height = merged_translated_image.height
height_to_crop = cropped_height + 1200
if height_to_crop >= max_height: height_to_crop = max_height
cropped_image = merged_translated_image.crop((0, cropped_height, max_width, height_to_crop))
cropped_image.save(os.path.join(output_dir, f"{file_index}.png"))
if height_to_crop < max_height: cropped_height = height_to_crop
else: break
file_index += 1
if __name__ == "__main__":
input_dir = "media/manga-gu881388/334"
output_dir = "media/manga-gu881388/334-merged"
max_size = 10 * 1024 * 1024 # 10 MB
count = merge_images_vertically(input_dir, output_dir, max_size)
print(f"Merged {count} images.")
# if __name__ == "__main__":
# input_dir = "media/manga-gu881388/334-merged-translated"
# output_dir = "media/manga-gu881388/334-translated"
# split_image_vertically(input_dir, output_dir)