- 세상의 모든 계산기 자유(질문) 게시판 팁 & 정보 ()
(프로그램) 계산기 폰트를 이미지로 저장하는 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
-
세상의모든계산기
버튼 안쪽은 색이 칠해지는게 좋을 것 같기도 한데...
일단은 이걸로 만족합니다.
예전에 폰트 설치하고,
문서 보면서
-> 포토샵에서 키 하나씩 눌러가며 이미지 만들고
-> 크기 맞춰서 저장하고
-> 또 리사이즈하고
하나하나 삽질하면서 만들었던 기억이 나는데
인공지능 시대가 좋네요.
프로그램 찾는 것보다도 빠르게 맞춤형으로 만들어주니...
* 사이트에 올릴 때는 파일명 순서로 나와서,
계산기 버튼 배치에 맞게 파일명은 노가다로 수정해 주어야 합니다.
-
세상의모든계산기 님의 최근 댓글
예시11) 선형 연립방정식에서 답이 false 로 나올 때 https://allcalc.org/55823 2025 10.22 approx(참 해) 값이 이상하게 튀는 것 같아서 AI를 이용해 (python 으로) 구해보았습니다. * python 의 유효자릿수가 nspire 의 유효자릿수(14자리~15자리)보다 더 길기 때문에 시도하였습니다. ** 원래는 wolfram alpha 로 구해보려고 했는데, 울프람에서는 수식 길이가 너무 길다고 거부하는 바람에 포기하였습니다. 그 결과, AI approx(참 해) 값은 정상 범주에 포함되었고, 이는 solve()로 구한 대부분의 결과값과 유사하였습니다. 그럼 nspire 의 approx(참 해)는 왜 튀었나? 참 해에 더하기,빼기,곱하기,나누기 가 너무 많이 포함되어 있다보니, 모두 계산하고 나면 오차가 누적&증폭되어 버리는 것 같습니다. 그래서 오히려 solve의 numeric 한 접근보다도 더 큰 오차가 발생한 듯 하고, 그래서 적절한 해의 x 구간을 벗어나버린 듯 합니다. 그것이 처음의 solve 에서 false 를 이끌어낸 주 원인이 아니었을까요? (추정) 2025 10.21 그래프로 확인 그래프 함수로 지정하고, 매우 좁은 구간으로 그래프를 확대해 보면 불연속적인 그래프 모습이 확인됩니다. 이것은 한계 digits(15자리) 이상을 처리하지 못하기 때문일 것이구요. 다만 특이한 점은, 그래프상으로 교점에 해당하는 구간이 73.049507058477≤x≤73.049507058484 사이로 나오는데 -> 이 구간은 'solve에서 여러 방법으로 직접 구해진 해들'은 포함되는 구간입니다. -> 하지만, '참값인 해를 계산기로 구한 appprox 값 x=73.049507058547'은 포함되지 않는 구간입니다. 2025 10.21 tns 파일 첨부 sol_num_vs_exact.tns 2025 10.21 검증하면 1번 식을 x에 대해 정리하고, → 그 x 값을 2번 식에 대입해 넣으면 → 그 결과로 x는 사라지고 y에 대한 식이 되니, y에 대해 정리하면 참값 y를 얻음. 얻은 y의 참값을 처음 x에 대해 정리한 1번식에 대입하면 참 값 x를 얻음. 구해진 참값의 근사값을 구하면 x=73.049507058547 and y=23.747548955927 참 값을 approx() 로 변환한 근사값은 원래 방정식 모두를 만족할 수 없지만, linsolve() 로 찾은 근사값과, AI로 참 값을 근사변환한 값은 원래 방정식 모두를 만족할 수 있습니다. 2025 10.21