- 세상의 모든 계산기 자유(질문) 게시판 팁 & 정보 ()
(프로그램) 계산기 폰트를 이미지로 저장하는 python 프로그램
import os import tkinter as tk from tkinter import filedialog from PIL import Image, ImageDraw, ImageFont from fontTools.ttLib import TTFont def create_character_images(font_path, output_folder, output_height=32): # 폰트 파일 로드 font_size = output_height * 2 # 초기 폰트 크기를 출력 높이의 2배로 설정 font = ImageFont.truetype(font_path, font_size) ttfont = TTFont(font_path) # 출력 폴더 생성 os.makedirs(output_folder, exist_ok=True) # 폰트에서 사용 가능한 모든 문자 추출 characters = set() for table in ttfont['cmap'].tables: for char_code, char_name in table.cmap.items(): if char_code < 0x10000: # Unicode 범위 내의 문자만 처리 characters.add(chr(char_code)) # 각 문자에 대해 이미지 생성 for char in characters: # 문자의 크기 측정 left, top, right, bottom = font.getbbox(char) width = max(1, right - left) height = max(1, bottom - top) # 여유 공간 추가 padding = font_size // 20 # 폰트 크기의 5%를 패딩으로 사용 width += padding * 2 height += padding * 2 # 이미지 생성 img = Image.new('RGBA', (width, height), (255, 255, 255, 0)) draw = ImageDraw.Draw(img) # 문자 그리기 draw.text((padding - left, padding - top), char, font=font, fill=(0, 0, 0, 255)) # 여백 제거 bbox = img.getbbox() if bbox: img = img.crop(bbox) else: continue # 빈 이미지인 경우 건너뛰기 # 높이를 32픽셀로 조정하면서 비율 유지 if img.height > 0: new_height = output_height new_width = max(1, int(img.width * (new_height / img.height))) img = img.resize((new_width, new_height), Image.LANCZOS) else: continue # 높이가 0인 경우 건너뛰기 # 이미지 저장 filename = f"{ord(char):04X}.png" img.save(os.path.join(output_folder, filename)) print(f"{output_folder}에 생성된 이미지: {len(characters)}개") # 파일 선택 대화상자 표시 root = tk.Tk() root.withdraw() # 기본 창 숨기기 font_path = filedialog.askopenfilename( title="폰트 파일 선택", filetypes=[("TrueType Font", "*.ttf"), ("All Files", "*.*")] ) if font_path: # 출력 폴더 생성 font_dir = os.path.dirname(font_path) font_name = os.path.splitext(os.path.basename(font_path))[0] output_folder = os.path.join(font_dir, font_name) create_character_images(font_path, output_folder, output_height=32) else: print("폰트 파일이 선택되지 않았습니다.")
1. 실행
2. .ttf 폰트 파일 선택
3. 선택한 폰트 파일이 있는 곳 아래에 폰트파일명의 폴더가 생성됨
4. 폰트 이미지가 png 파일로 저장됨 : 배경(background) 없음.
댓글4
-
세상의모든계산기
버튼 안쪽은 색이 칠해지는게 좋을 것 같기도 한데...
일단은 이걸로 만족합니다.
예전에 폰트 설치하고,
문서 보면서
-> 포토샵에서 키 하나씩 눌러가며 이미지 만들고
-> 크기 맞춰서 저장하고
-> 또 리사이즈하고
하나하나 삽질하면서 만들었던 기억이 나는데
인공지능 시대가 좋네요.
프로그램 찾는 것보다도 빠르게 맞춤형으로 만들어주니...
* 사이트에 올릴 때는 파일명 순서로 나와서,
계산기 버튼 배치에 맞게 파일명은 노가다로 수정해 주어야 합니다.
-
세상의모든계산기 님의 최근 댓글
고장남 - POST 진입 실패, 모니터 안나옴 직접 사용할 일이 없어져서, 고향집에 가져다 놓고 어댑터만 꼽아 두었습니다. 마지막으로 켠 것은 25년 6월쯤이 아니었을까 싶습니다. (이상증상은 없었구요) 이번 추석에 가서 켜 보니까, 화면이 아예 안나오더라구요. 집에 가져와서 분해해 살펴보니까 - 어댑터 12V는 정상 - 어댑터 꼽으면 바로 POWER 는 켜집니다. ㄴ POWER ON -> Fan 돌아감 + 파워 LED 들어옴 + NVME에 LED 들어옴 ㄴ HDMI 1, 2 신호 전혀 안들어옴 (모니터 2대 확인) ㄴ 키보드에 LED 안들어옴 (USB 5V 가 안들어오는 듯 함) - 옆구리 버튼은 작동하지 않습니다. 길게 눌러도 꺼지지 않음. 하나씩 제거하면서 변수를 제거해 봤는데, 뭘 해도 상태가 똑같습니다. 보드쪽에 문제가 생긴 것 같습니다. 2025 10.14 다항식 나눗셈 (가장 정석적인 방법) (피제수, 나뉠 식) r1*r3 를 (제수, 나누는 식) r1+r3 로 직접 나누며, 여기서 r1을 변수로 취급합니다. 1. 몫 구하기: r1*r3 (나뉠 식)의 최고차항을 r1+r3 (나누는 식)의 최고차항 r1로 나눕니다. (r1*r3) / r1 = r3 <-- 이것이 몫(Quotient)이 됩니다. 2. 나머지 구하기: (원래 분자) - (몫 × 분모) 를 계산합니다. (r1*r3) - (r3 × (r1+r3)) = r1*r3 - (r1*r3 + r3^2) = -r3^2 <-- 이것이 나머지(Remainder)가 됩니다. 3. 결과 조합: 최종 결과는 `몫 + (나머지 / 나누는 식)` 형태로 씁니다. r3 + (-r3^2 / (r1+r3)) \[ \begin{array}{l} \phantom{r_1+r_3 \overline{) r_1 r_3}} r_3 \\ r_1+r_3 \overline{) \begin{array}[t]{@{}r@{}} r_1 r_3 \phantom{+r_3^2} \\ - (r_1 r_3 + r_3^2) \\ \hline -r_3^2 \\ \end{array}} \end{array} \] 2025 10.14 부분적 과정으로 분자(변수의 곱)를 다른 변수로 치환할 수 있다면 (r1*r3=a, r2*r4=b) 다항식에서도 강제 나눗셈 과정을 막을 수 있겠습니다만, 원래의 식에 적용시킬 수는 없어 의미가 없겠습니다. 2025 10.14 (r1*r3) / (r1+r3) 에서 원래라면 분자(r1*r3)에서 하나의 변수를 선택하여 그것을 기준으로 분모를 나누고 몫과 나머지로 분리하여 표현하는 것이 기본 원칙입니다만, 결과가 단항인 분수식일 경우 분자가 두 변수의 곱으로 표현되더라도 그것이 더 간단한 표현인 것으로 보고 그대로 두는 듯 합니다. 하지만 마지막 예시에서 보이는 것처럼 +1만 붙는 간단한 형식일지라도 다항식이 되는 순간 원래의 기본 원칙대로 대수의 나눗셈(r1*r3를 (r1+r3)로 나눔)이 강제 진행되어버리고 이를 막을 수 없는 듯 합니다. 2025 10.14 낮에 TV에서 영화 '말모이' 해주더라구요. 그래서 한번 물어 봤습니다. 2025 10.10