티스토리 뷰

지난 포스팅에서 소개했던 파이썬으로 이미지를 생성하는 코드입니다.

이 코드는 현재 디렉토리의 .txt 파일 이름을 이용해 최대 3줄로 줄바꿈한 텍스트를 포함하는 128x128 크기의 검은색 썸네일 이미지를 생성하고, 이를 thumbnails 폴더에 저장합니다. 텍스트는 흰색으로 중앙에 배치되며, 텍스트 크기는 이미지에 맞도록 조정됩니다.

이미지 생성에는 PIL이라는 라이브러리를 사용합니다.

코드 실행 시 폴더에 이미 해당 이름의 이미지 파일이 있다면 새로 생성하지 않고 넘어갑니다. 최종적으로, .txt 파일마다 해당 텍스트가 표시된 썸네일이 저장되는 구조로 작동합니다.

import os
from PIL import Image, ImageDraw, ImageFont

# Define the path for the thumbnails folder
thumbnails_path = './thumbnails'
os.makedirs(thumbnails_path, exist_ok=True)

# Loop through each text file in the current directory
for file in os.listdir('.'):
    if file.endswith('.txt'):
        # Get the filename without the '.txt' extension
        filename = file.replace('.txt', '')
        thumbnail_file = f'{thumbnails_path}/{filename}.png'

        # Check if the thumbnail already exists
        if os.path.exists(thumbnail_file):
            print(f"'{thumbnail_file}' 파일이 이미 존재하여 건너뜁니다.")
            continue  # 파일이 이미 존재하면 다음 파일로 넘어갑니다.

        # Create a 128x128 black image
        img = Image.new('RGB', (128, 128), color='black')
        d = ImageDraw.Draw(img)

        # Define the initial font and maximum font size
        font_size = 24  # 초기 글꼴 크기 설정
        font = ImageFont.load_default()

        # Try to fit the text within the image, wrapping text if necessary
        max_width, max_height = 128, 128  # 이미지 크기
        text = filename  # 텍스트 파일 이름을 표시할 텍스트로 사용

        # 줄바꿈된 텍스트 계산 함수
        def wrap_text(text, font, max_width):
            words = text.split()
            lines = []
            current_line = ""
            for word in words:
                test_line = f"{current_line} {word}".strip()
                bbox = d.textbbox((0, 0), test_line, font=font)
                width = bbox[2] - bbox[0]  # 텍스트의 너비 계산
                if width <= max_width:
                    current_line = test_line
                else:
                    lines.append(current_line)
                    current_line = word
            lines.append(current_line)
            return lines[:3]  # 최대 3줄까지만 반환

        # Adjust font size to fit within the image
        while font_size > 8:  # 최소 글꼴 크기 8로 제한
            font = ImageFont.truetype("fonts/BMDOHYEON_ttf.ttf", font_size)  # 시스템에 따라 폰트 경로 조정 필요
            wrapped_text = wrap_text(text, font, max_width)
            text_height = sum(d.textbbox((0, 0), line, font=font)[3] - d.textbbox((0, 0), line, font=font)[1] for line in wrapped_text)
            if text_height <= max_height:
                break
            font_size -= 1

        # Calculate position to center the wrapped text vertically
        total_text_height = sum(d.textbbox((0, 0), line, font=font)[3] - d.textbbox((0, 0), line, font=font)[1] for line in wrapped_text)
        y_offset = (max_height - total_text_height) // 2

        # Draw each line of wrapped text
        for line in wrapped_text:
            bbox = d.textbbox((0, 0), line, font=font)
            text_width = bbox[2] - bbox[0]
            text_height = bbox[3] - bbox[1]
            position = ((max_width - text_width) // 2, y_offset)
            d.text(position, line, fill=(255, 255, 255), font=font)
            y_offset += text_height

        # Save thumbnail image in thumbnails folder
        img.save(thumbnail_file)
        print(f"'{thumbnail_file}' 파일을 새로 생성했습니다.")
반응형
댓글