File size: 3,467 Bytes
bac55b4
 
 
 
 
6810bed
 
bac55b4
 
 
 
6810bed
 
bac55b4
6810bed
bac55b4
 
6810bed
bac55b4
 
 
 
6810bed
 
bac55b4
6810bed
bac55b4
 
 
 
 
 
 
 
 
 
 
 
014abd7
bac55b4
6810bed
bac55b4
 
 
 
6810bed
014abd7
bac55b4
6810bed
bac55b4
 
6810bed
bac55b4
 
6810bed
 
bac55b4
 
 
 
 
 
 
 
 
 
 
6810bed
bac55b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6810bed
bac55b4
 
6810bed
bac55b4
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
from PIL import Image, ImageDraw, ImageFont
from io import BytesIO

from src.constants import front_card_img_dict

# Pixel position information for each area of the card image
# Picture
PICTURE_LT_XY = (65, 188)
PICTURE_RB_XY = (802, 925)
PICTURE_SIZE = (PICTURE_RB_XY[0] - PICTURE_LT_XY[0], PICTURE_RB_XY[1] - PICTURE_LT_XY[1])

# Title
# Create some margin
TITLE_LT_XY = (65, 45) 
TITLE_RB_XY = (647, 132)
TITLE_SIZE = (TITLE_RB_XY[0] - TITLE_LT_XY[0], TITLE_RB_XY[1] - TITLE_LT_XY[1])

# Main Body of Description
DESCRIPTION_LT_XY = (46, 972)
DESCRIPTION_RB_XY = (810, 1174)
DESCRIPTION_SIZE = (DESCRIPTION_RB_XY[0] - DESCRIPTION_LT_XY[0], DESCRIPTION_RB_XY[1] - DESCRIPTION_LT_XY[1])

# Font information
# Ming Typeface
font_selif_path = 'data/fonts/SourceHanSerif-Bold.otf'
# Gothic Typeface
font_sanselif_path = 'data/fonts/SourceHanSans-Bold.otf'

def crop_center(pil_img, crop_width, crop_height):
    img_width, img_height = pil_img.size
    return pil_img.crop(((img_width - crop_width) // 2,
                         (img_height - crop_height) // 2,
                         (img_width + crop_width) // 2,
                         (img_height + crop_height) // 2))
    
def crop_max_square(pil_img):
    return crop_center(pil_img, min(pil_img.size), min(pil_img.size))
    
def create_card_image(card_frame_bytearray, img_bytearray, option_dict):

    # Loading and Cropping of Picture
    picture_img = Image.open(img_bytearray)
    picture_img = crop_max_square(picture_img)
    picture_img = picture_img.resize(PICTURE_SIZE)

    # Loading of Card Frame
    card_img = Image.open(card_frame_bytearray)

    # Embedding a Picture in the Card
    card_img.paste(picture_img, PICTURE_LT_XY)

    ## Preparing for editting the card image
    card_imgdraw = ImageDraw.Draw(card_img)

    # Embedding the Title
    # (Support for multiple lines if needed)
    title_font_size = 100
    while True:
        title_font = ImageFont.truetype(font_selif_path, title_font_size)
        title_bbox = card_imgdraw.textbbox(TITLE_LT_XY , option_dict['γ‚Ώγ‚€γƒˆγƒ«'], title_font)
        
        if (title_bbox[2] <= TITLE_RB_XY[0] and title_bbox[3] <= TITLE_RB_XY[1]) or title_font_size <= 30:
            break
        title_font_size -= 1

    card_imgdraw.text((TITLE_LT_XY[0], int((TITLE_LT_XY[1] + TITLE_RB_XY[1]) / 2)), option_dict['γ‚Ώγ‚€γƒˆγƒ«'], fill='black', font=title_font, anchor='lm')

    # Embedding the Description Text
    description_font = ImageFont.truetype(font_sanselif_path, 40)

    description_list = []
    description_length = len(option_dict['θͺ¬ζ˜Žζ–‡'])
    temp_start = 0
    for i in range(description_length):
        temp_end = i
        description_line_bbox = card_imgdraw.textbbox((0, 0), option_dict['θͺ¬ζ˜Žζ–‡'][temp_start:temp_end+1], description_font)
        if description_line_bbox[2] > DESCRIPTION_SIZE[0]:
            description_list.append(option_dict['θͺ¬ζ˜Žζ–‡'][temp_start:temp_end])
            temp_start = i

    description_list.append(option_dict['θͺ¬ζ˜Žζ–‡'][temp_start:])
    description_display = '\n'.join(description_list)

    card_imgdraw.text(DESCRIPTION_LT_XY, description_display, fill='black', font=description_font)

    # Outputting Binary Data
    output_img_bytearray = BytesIO()
    card_img.convert('RGB').save(output_img_bytearray, "JPEG", quality=95)
    output_img_bytearray.seek(0) # Seek to the beginning of the image, otherwise it results in empty data

    return output_img_bytearray