본문으로 건너뛰기
블로그로 돌아가기
이미지 제작

AI 이미지에 한글이 깨질 때: 배경은 AI, 글자는 코드로 굽는다 | 비교원

AI 이미지 생성기는 한글·로고·정확한 픽셀을 못 만든다. 그래서 그림과 글자를 가른다. 배경 장면만 AI로(클로드가 Codex를 불러 imagegen으로), 로고와 한글은 HTML에 웹폰트로 얹어 헤드리스 브라우저로 PNG로 굽는다. 블로그 일러스트 6~8장과 OG 카드 수십 장을 한 줄기로 자동화한 제작 기록.

12분 소요이미지 제작
AI 이미지 한글AI 이미지 글자 깨짐AI 이미지 생성Codex imagegenOG 이미지 만들기오픈그래프 이미지한글 웹폰트헤드리스 브라우저 스크린샷평면 벡터 일러스트썸네일 자동화카카오톡 링크 미리보기이미지 일괄 생성
AI 이미지에 한글이 깨질 때: 배경은 AI, 글자는 코드로 굽는다 | 비교원

대상: 마케터 · 1인 운영자 · 콘텐츠 제작자  ·  형식: 구축 기록 + 제작법  ·  2026-06-26

핵심 요약 · TL;DR

Q. AI 이미지에 한글·로고가 깨지는데 어떻게 만들죠?

AI 이미지 생성기는 한글 글자랑 정확한 로고, 딱 맞는 픽셀 크기를 못 만든다. 그래서 그림과 글자를 갈라놓는다. 배경 장면만 AI로 만들고(클로드는 그림 기능이 없어서 Codex를 불러 imagegen으로 그린다), 로고랑 한글은 HTML에 한글 웹폰트로 얹어 헤드리스 브라우저로 PNG로 굽는다. 글자가 없는 블로그 일러스트는 숫자를 그림 밖 캡션에 맡기고, 글자가 필요한 OG 카드는 코드가 픽셀 바깥에서 얹는다. 페이지가 많으면 시트 두 칸(장면 키, 카피)으로 한꺼번에 뽑는다.

오늘 바로 쓸 핵심 3줄

  • 글자는 AI한테 시키지 마라. 배경만 AI로 두고, 글자랑 로고는 코드로 얹어라.
  • 클로드엔 그림 기능이 없다. codex exec로 ChatGPT 로그인된 Codex의 imagegen을 빌려 쓴다.
  • 헤드리스로 구울 땐 한글 폰트를 파일에 심고, 이미지를 갈아끼우면 ?v=로 캐시를 깬다.
네이비 액자 속 한글 같은 글자는 회색 덩어리로 뭉개지고, 액자 밖 띠의 글자는 또렷한 평면 벡터 대비

이미지: 글자를 그림 안에 넣으면 뭉개지고, 그림 밖에 두면 또렷하다. 이 글이 말하려는 한 줄이다.

AI한테 글자를 맡기면, 글자가 그림이 되어 뭉개진다

AI 이미지 생성기는 그림을 픽셀로 그린다. 문제는 글자도 똑같이 '글자처럼 보이는 픽셀'로 그린다는 거다. 그러니 한글 제목을 넣어달라고 하면, 획만 어설프게 흉내 낸 깨진 덩어리가 나온다.

로고도 마찬가지다. 진짜 로고를 모르니 비슷하게 생긴 가짜를 지어낸다. 색이며 자간이며 어딘가 미묘하게 어긋나 있다. 프롬프트를 아무리 손봐도 매번 제대로 나오질 않는다. 운 좋게 한 장 그럴듯하게 건져도 다음 장에서 다시 무너지고.

크기도 안 맞는다. "800 곱하기 400으로 뽑아줘" 해도 딱 그 치수로는 안 나온다. 규격이 어긋난 카드는 카톡이나 페북이 알아서 잘라버린다. 정작 카드에 꼭 필요한 세 가지, 글자랑 로고랑 정확한 치수가 하필 전부 AI가 제일 약한 부분인 셈이다.

그래서 글자를 그림에서 떼어냈다

한참을 프롬프트와 씨름하다 방향을 틀었다. 글자까지 AI한테 맡긴 게 애초에 잘못이었다. AI는 분위기랑 장면 잡는 데만 쓰고, 글자는 글자대로 따로 얹기로 했다.

그러고 나니 원리가 한 줄로 정리됐다. AI는 그림을 만들고, 글자는 픽셀 밖에 산다. 배경 그림과 텍스트(제목·로고)를 아예 다른 층으로 보는 거다. 그림은 좀 뭉개져도 그만인 '분위기'고, 글자는 절대 깨지면 안 되는 '정보'니까.

그림 레이어와 글자 레이어가 가운데서 한 장의 카드로 겹쳐지는 평면 벡터 도식

그림 층은 AI가, 글자 층은 코드가. 둘을 겹쳐 한 장으로 만든다. 도구는 둘, 원리는 하나.

이 한 줄이 두 군데에 똑같이 통한다. 글자가 아예 없는 블로그 일러스트는 숫자를 그림 밖 캡션이 대신 말해준다. 글자가 꼭 들어가야 하는 공유 카드는 코드가 픽셀 바깥에서 제목을 얹는다. 쓰는 도구만 다를 뿐, 원리는 하나다.

그림은 클로드가 코덱스를 빌려 만든다

그런데 그 그림은 대체 누가 그리나. 지금 이 글을 쓰는 클로드(Claude)한테는 이미지 생성 기능이 없다. 글은 써도 그림은 못 그린다. 그래서 옆에 있는 다른 도구를 불러다 쓴다.

그 도구가 코덱스(Codex)다. 터미널에서 돌아가는 코딩 에이전트인데, ChatGPT 계정으로 한 번 로그인해두면 그림 그리는 기능(imagegen)이 딸려 온다. 클로드는 명령어 한 줄로 코덱스를 깨워서 "이런 그림 그려서 여기 저장해"라고 시키기만 하면 된다.

실제 명령은 이렇게 생겼다. 코드라고 겁먹을 것 없다. "코덱스야, imagegen으로 그려서 assets 폴더에 PNG로 저장해"라는 말을 기계가 알아듣게 옮긴 것뿐이다.

codex exec --dangerously-bypass-approvals-and-sandbox - <<'PROMPT'
use the imagegen skill (built-in image_gen tool).
Flat vector editorial illustration, navy #1c3d5a base + beige,
single orange #ff8649 accent, no text, no faces.
Save to .../05-outputs/blog/assets/2026-06-26_hero.png
PROMPT
글 쓰는 도구가 열쇠로 열리는 중계 도구를 거쳐 그림 파일을 내놓는 3단 흐름

클로드가 코덱스를 부르면, 코덱스가 그림을 내놓는다. 그림은 ChatGPT 로그인으로 빌려 쓰는 셈이다.

한 번에 여러 장을 몰아서 시킬 수도 있는데, 시간이 좀 걸리니까 백그라운드로 돌려놓고 그동안 글을 마저 쓴다. 정리하면 이렇다. 클로드가 직접 그리는 게 아니라, 그림 잘 그리는 코덱스를 ChatGPT 로그인으로 빌려 쓰는 구조다.

글자 없는 그림은 쉽다, 숫자를 캡션에 넘기면 된다

글자가 아예 없는 그림부터. 이 블로그에 깔린 일러스트들이 그렇다. 개념이나 은유, 분위기만 담고 수치나 결론처럼 '글자로 말해야 하는 것'은 그림 안에 절대 안 넣는다.

스타일은 한 세트로 묶어둔다. 평면 벡터에 navy 베이스, 모래·베이지 톤, 그리고 주황 #ff8649 포인트 하나. 글자도 숫자도 없고, 얼굴은 디테일 없이 뭉뚱그린다. 한 글에 들어가는 그림끼리 형제처럼 보이게 하려는 거다.

글자 없는 일러스트와 그 아래 또렷한 캡션 띠가 분리된 구조

그림엔 글자가 없다. 수치와 결론은 그림 밖 캡션이 맡는다.

그럼 "생존율 30 대 10" 같은 숫자는 어디서 말하느냐. 그림 바로 아래 캡션이 맡는다. 그림은 분위기를 깔고, 숫자는 캡션이 박는다. 글자를 픽셀 밖에 두는 가장 손쉬운 방식이다.

글자가 필요한 카드, 코드가 픽셀 밖에서 헤드라인을 얹는다

글자 없는 그림은 사실 쉬운 축이다. 진짜 골치는 글자가 반드시 들어가야 하는 카드다. 링크를 채팅방에 붙였을 때 뜨는 그 공유 카드(OG 이미지) 말이다. 거기엔 제목도, 로고도, 보조 문구도 또렷해야 한다.

여기에 아까 그 원리를 한 번 더 쓴다. 배경 장면만 AI로 만들되, 이번엔 한쪽을 비워둔다. 왼쪽 45%를 글자 자리로 남기고, 텍스트나 로고 없이 모델과 소품만 채운다. 그 빈자리에 코드가 글자를 올린다.

글자는 HTML로 짠다. 한글 웹폰트를 입힌 제목, 진짜 로고 SVG, 포인트 색으로 강조한 단어. 이 HTML을 헤드리스 브라우저(화면 안 띄우는 크롬)로 열어서 사진 찍듯 캡처하면 PNG가 떨어진다. 글자는 폰트로 그려지니까 늘 또렷하고, 크기도 정확하다.

HTML 템플릿이 헤드리스 브라우저를 거쳐 완성 PNG 카드로 나오는 흐름

배경은 AI, 글자는 HTML. 헤드리스 크롬으로 캡처하면 글자가 또렷한 PNG가 나온다.

chrome --headless=new --hide-scrollbars \
  --force-device-scale-factor=1 --window-size=800,400 \
  --screenshot=card.png "file:///.../card.html"

제목 길이는 페이지마다 다르다. 그래서 글자 크기를 자동으로 맞춘다. 왼쪽 글자 영역 폭을 440px로 잡아두고, 한글은 1.0, 영문이나 공백은 0.45로 글자 폭을 어림잡아 폰트 크기를 40~62px 사이에서 조절한다. 짧은 제목은 큼직하게, 긴 제목은 줄여서 한 줄에 억지로 욱여넣지 않는다.

왜 이렇게 키워두냐면, 카톡 카드는 폭 300px 안팎으로 줄어서 뜨기 때문이다. 작게 줄어도 읽히게 설계하는 요령은 따로 정리해뒀으니(안 읽히는 OG 이미지 고치기), 이 글에서는 '어떻게 만드느냐'에만 집중한다.

헤드리스에서도 한글이 깨졌다, 폰트를 파일에 박았다

이제 다 됐다 싶었는데, 함정이 하나 더 숨어 있었다. 헤드리스 크롬은 그 PC에 깔린 폰트로 글자를 그린다. 그러다 보니 디자인 폰트가 안 깔린 PC나, 글을 통째로 공유한 파일에서는 글자가 또 엉뚱하게 떨어졌다.

원인은 간단하다. 폰트를 '이름'으로만 걸어두면, 그 폰트가 없는 환경은 대충 비슷한 걸로 바꿔 끼운다. 그래서 폰트 파일 자체를 HTML 안에 base64로 박아 넣었다. 이러면 폰트가 글이랑 한 몸으로 따라다닌다. 다른 PC에서도, 인터넷이 끊겨도 디자인 폰트 그대로다.

함정: 헤드리스 캡처는 결국 그 컴퓨터에 깔린 폰트에 기댄다. 한글 디자인 폰트를 파일에 심어두지 않으면, 폰트 없는 PC나 공유본에서 글자가 대체 폰트로 떨어진다. "내 PC에선 멀쩡하던데"가 나오는 지점이 정확히 여기다.

폰트 없는 카드가 어긋나고, 폰트 칩을 박은 카드가 또렷해지는 before/after

폰트를 이름으로만 걸면 폰트 없는 PC에서 어긋난다. 파일에 심어두면 어디서든 또렷하다.

로고랑 모델도 같은 이치다. 로고는 AI가 그린 가짜 말고 공식 SVG·PNG로, 모델은 배경 지운 공식 누끼 이미지로 얹는다. 깨지면 안 되는 건 죄다 코드가 정확한 원본으로 올리는 거다.

수십 장은 손으로 못 만든다, 시트 두 칸이 만든다

카드 한 장 만드는 법이 잡혔으면, 다음은 물량이다. 페이지가 수십 개면 카드도 수십 장이다. 이걸 한 장씩 HTML 열어 고치다간 금방 나가떨어진다. 그래서 스프레드시트 한 장을 관제탑으로 세운다.

시트엔 칸 두 개만 채운다. 장면 키 칸엔 어떤 배경을 쓸지 적고(기기별·기능별·콘텐츠형), 카피 칸엔 제목과 보조 문구를 한 셀에 몰아 적는다. 줄바꿈은 //, 강조할 단어는 *별표*로 감싸고, 보조 문구는 || 뒤에 붙인다. 스크립트가 행마다 읽어서 카드를 한꺼번에 굽는다.

무엇을 적나
장면 키어떤 배경 장면을 쓸지internet · mobile · apple
카피제목·강조·줄바꿈·보조 문구를 한 셀에인터넷 가입 // 현금 지원 || 대기 없이 바로

한 셀 안에서 //는 줄바꿈, *별표*로 감싼 단어는 포인트 색 강조, || 뒤는 보조 문구로 갈린다. 스크립트가 이 기호를 읽어 알아서 배치한다.

두 칸이 강조된 스프레드시트가 카드 썸네일들을 줄지어 생성하는 도식

사람은 시트 두 칸, 장면 키와 카피만 채운다. 카드 수십 장은 스크립트가 굽는다.

마지막은 호스팅이다. 카드가 카드로 뜨려면 공개 URL이어야 한다. 그래서 깃허브 같은 공개 저장소에 올려 그 주소를 쓴다. 여기 함정이 딱 하나 있다. 이미지를 갈아끼웠는데 며칠째 옛날 카드가 그대로 뜬다. 캐시가 파일 내용이 아니라 주소를 기억하는 탓이다. 주소 끝에 ?v=2처럼 버전을 하나 올려주면 새 주소로 인식해서 캐시가 깨진다.

URL 자물쇠에 묶인 옛 그림을 버전 열쇠가 열어 새 그림을 드러내는 도식

캐시는 주소를 기억한다. 파일만 갈면 안 바뀐다. ?v= 버전을 올려 자물쇠를 연다.

정리, 다음에 이미지가 깨지면

결국 한 줄기다. 글자는 AI한테 안 맡긴다. 그림은 코덱스를 빌려 만들고, 글자는 코드가 픽셀 밖에서 얹고, 폰트는 파일에 심고, 물량이 많아지면 시트가 굽는다.

이미지가 깨질 때 점검할 6가지
  1. 분업: 글자·로고·정확한 크기까지 AI한테 시키고 있진 않나? 배경만 AI로 두고, 글자는 코드로 떼어내라.
  2. 그림 생성: 클로드엔 그림 기능이 없다. codex exec로 ChatGPT 로그인된 imagegen을 불러서 assets에 PNG로 저장하라.
  3. 글자 없는 그림: 수치나 결론을 그림 안에 그려 넣었나? 그림 밖 캡션으로 빼라(평면 벡터·navy+주황·글자 없음).
  4. 글자 있는 카드: 배경은 한쪽 45%를 비우고, 제목·로고는 HTML+한글 폰트로 짜서 헤드리스로 구워라.
  5. 폰트: 헤드리스가 시스템 폰트에 기대고 있진 않나? 한글 폰트를 파일에 심어 "내 PC에선 멀쩡"을 없애라.
  6. 운영·캐시: 수십 장이면 시트 두 칸(장면·카피)으로 한꺼번에 뽑고, 갈아끼운 뒤엔 ?v=로 캐시를 깨라.

그래도 딱 하나만 챙긴다면, 이거다.

AI는 그림을 만들고, 글자는 픽셀 밖에 산다. 깨지면 안 되는 건 코드한테 맡겨라.

근거·출처

이 글의 제작법(배경은 AI, 글자는 코드, 헤드리스로 굽기, 시트로 일괄)은 실제 한 사이트의 공유 카드와 이 블로그의 이미지들을 그렇게 만들어 온 기록이다. AI가 한글·로고·정확한 픽셀을 못 만든다는 건 직접 겪어 본 것이고(생성기나 시점에 따라 정도 차이는 있다), 카드 사이즈·캐시·재스크랩은 위 1차 출처로 확인했다. 회사·브랜드 세부는 일반화해서 적었다.

이 글이 도움이 되었다면 공유해주세요

최신 인사이트

관련 프로젝트

새 글을 이메일로 받아보세요

마케팅, 분석, 개발 인사이트를 정리해서 보내드려요.