Cricut 프로젝트를 위한 Base64 → SVG 디코더 만들기
Source: Dev.to
Base64를 SVG로 디코딩하는 Cricut 프로젝트용 디코더 만들기
Cricut 기계는 SVG 파일을 직접 읽을 수 있지만, 때때로 디자인 툴에서 Base64 인코딩된 SVG 데이터를 복사해 붙여넣게 됩니다. 이런 경우에는 직접 디코딩해서 파일로 저장해야 합니다. 이번 포스트에서는 Node.js와 몇 가지 간단한 스크립트를 사용해 Base64 → SVG 변환 파이프라인을 만드는 과정을 단계별로 살펴보겠습니다.
📚 왜 Base64인가?
- 텍스트 기반: HTML, CSS, JSON 등 텍스트 파일에 직접 삽입 가능
- 전송 안정성: 바이너리 데이터를 손상 없이 전송
- 편리성: 디자인 툴(예: Figma, Adobe XD)에서 “Copy as SVG”를 하면 종종 Base64 문자열이 반환됨
하지만 Cricut 소프트웨어는 순수 SVG 파일을 요구하므로, 이 문자열을 다시 파일 형태로 변환해야 합니다.
🛠️ 준비물
| 항목 | 버전 |
|---|---|
| Node.js | >= 14 |
| npm | >= 6 |
fs (Node 내장) | — |
path (Node 내장) | — |
Tip: 프로젝트 폴더를 만들고
npm init -y로package.json을 초기화하세요.
📂 프로젝트 구조
base64-to-svg/
├─ src/
│ └─ decode.js
├─ input/
│ └─ design.txt # Base64 문자열이 들어있는 파일
├─ output/
│ └─ design.svg # 디코딩된 결과물
└─ package.json
✍️ decode.js 구현
아래 코드는 Base64 문자열을 읽어 SVG 파일로 저장하는 가장 기본적인 로직입니다.
// src/decode.js
const fs = require('fs');
const path = require('path');
// 입력 파일 경로와 출력 파일 경로 정의
const INPUT_PATH = path.resolve(__dirname, '..', 'input', 'design.txt');
const OUTPUT_PATH = path.resolve(__dirname, '..', 'output', 'design.svg');
// 파일에서 Base64 문자열을 읽음
const base64Data = fs.readFileSync(INPUT_PATH, { encoding: 'utf8' }).trim();
// Data URL 형식(`data:image/svg+xml;base64,`)이 포함돼 있다면 제거
const cleanedBase64 = base64Data.replace(/^data:image\/svg\+xml;base64,/, '');
// Buffer를 사용해 디코딩하고 SVG 파일로 저장
fs.writeFileSync(OUTPUT_PATH, Buffer.from(cleanedBase64, 'base64'));
console.log(`✅ SVG 파일이 생성되었습니다: ${OUTPUT_PATH}`);
주요 포인트
trim()– 파일 끝에 개행 문자(\n)가 있을 경우 제거합니다.- 정규식 –
data:image/svg+xml;base64,프리픽스가 포함된 경우 자동으로 잘라냅니다. Buffer.from(..., 'base64')– Node.js가 제공하는 가장 빠른 Base64 디코딩 메서드입니다.
🚀 실행 방법
node src/decode.js
성공하면 output/design.svg 파일이 생성됩니다. 이제 Cricut Design Space에 바로 업로드할 수 있습니다.
🧩 확장 아이디어
| 아이디어 | 설명 |
|---|---|
| CLI 옵션 | commander 혹은 yargs를 사용해 입력·출력 경로를 커맨드라인 인자로 지정 |
| 다중 파일 지원 | 입력 폴더에 있는 모든 .txt 파일을 순회해 각각 SVG로 변환 |
| HTML 인라인 | 변환된 SVG를 <img src="data:image/svg+xml;base64,..." /> 형태로 바로 삽입하는 스크립트 |
| 에러 핸들링 | 잘못된 Base64 문자열에 대한 친절한 오류 메시지 출력 |
📌 마무리
Base64 → SVG 변환은 몇 줄의 코드만으로도 충분히 구현할 수 있습니다. 위 예제는 Cricut 프로젝트에 바로 적용할 수 있도록 최소한의 의존성만 사용했으며, 필요에 따라 자유롭게 확장할 수 있습니다.
핵심 요약
- Base64 문자열을 파일에서 읽고, 프리픽스를 제거한다.
Buffer.from(..., 'base64')로 디코딩한다.- 디코딩된 데이터를
.svg파일로 저장한다.
Cricut 작업 흐름에 이 스크립트를 넣어두면, 디자인 툴에서 복사한 SVG를 바로 사용할 수 있어 생산성이 크게 향상됩니다. 즐거운 메이킹 되세요! 🎉
문제
“Base64를 SVG로 변환”은 간단해 보입니다:
- 인코딩된 문자열을 붙여넣기.
- 디코딩하기.
- SVG를 다운로드하기.
실제로 사용자는 다양한 종류의 입력을 붙여넣습니다:
| 입력 유형 | 예시 |
|---|---|
| Full SVG data URL | data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My... |
| Plain Base64 string | PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My... |
| Raw SVG markup | … |
| Embedded raster image (PNG/JPG/WEBP) | Base64‑encoded bitmap data |
| AI‑generated or copied markup | Anything a design tool or website spits out |
Cricut 사용자는 인코딩에 신경 쓰지 않습니다 – Cricut Design Space에 가져올 수 있는 깨끗하고 사용 가능한 SVG 파일만 필요합니다.
“Cricut‑Ready” SVG는 무엇이 다른가?
| 웹 지향 SVG | Cricut 지향 SVG |
|---|---|
| 실시간 텍스트, CSS, 마스크, 클리핑 경로, 메타데이터, 스크립트 등 포함될 수 있음 | 실제 경로가 필요하고, 스크립트는 없어야 하며, 메타데이터는 최소화하고, 크기가 예측 가능해야 함 |
| 고정된 width/height도 괜찮음 | viewBox와 반응형 차원을 선호함 |
| 색상은 자유롭게 지정 가능 | 종종 단일 색상 또는 컷 친화적 팔레트를 요구함 |
| 라스터 이미지는 디스플레이용으로는 괜찮음 | 라스터 이미지는 트레이싱(비용이 많이 듦)하거나 컷 파일용으로 제거해야 함 |
| 추가 ID/클래스는 무해함 | 추가 마크업은 Design Space를 혼란스럽게 할 수 있어 제거해야 함 |
Source: …
도구의 핵심 기능
자동 입력 감지
- 붙여넣기가 데이터 URL, 일반 Base64, 원시 SVG, 혹은 래스터 이미지인지 감지합니다.
디코딩 및 정리 (클라이언트‑사이드)
- Base64 → SVG 디코딩이 브라우저 내에서 완전히 이루어지며 서버 라운드‑트립이 없습니다.
- 정리 옵션은 다음을 제거합니다:
<script>태그<style>요소- 주석
- 고정된
width/height(적절한viewBox를 추가) - 원치 않는 래스터
<image>태그 (선택 사항)
프리셋‑기반 워크플로
| 프리셋 | 일반적인 사용 사례 |
|---|---|
| 라인 아트 | 단순 경로, 단색 컷 파일 |
| 멀티‑컬러 / 프린트‑후‑컷 | 색상 유지, 선택적 래스터 이미지 포함 |
| 일반 정리 | 스크립트/메타데이터 제거, 크기 정규화 |
- 사용자는 붙여넣기 → 프리셋 선택 → 미리보기 → 다운로드/복사만 하면 됩니다.
- 고급 설정은 숨겨져 있지만 파워 유저를 위해 여전히 접근 가능합니다.
미리보기 및 내보내기 옵션
- 실시간 SVG 미리보기 (확대/축소 가능).
- 다운로드: 정리된 SVG 파일.
- 복사: SVG 코드를 클립보드에 복사.
- 복사: 디코딩된 텍스트(원시 XML)를 복사.
- 보고서 내보내기 (JSON/HTML) – 감지된 문제와 수행된 작업 요약.
- 인쇄 / PDF: 문서화를 위한 보고서 출력.
래스터 이미지 처리 (백엔드)
- 입력이 Base64‑인코딩된 PNG/JPG/WEBP인 경우, 도구가 비트맵을 벡터 경로로 트레이싱합니다.
- 이 트레이싱은 CPU 집약적이므로 별도의 백엔드 서비스에서 속도 제한을 두고 실행됩니다.
- 일반 SVG 디코딩은 백엔드에 전혀 접근하지 않으며, 대부분의 사용자가 빠르게 이용할 수 있습니다.
사용자 흐름 (간소화)
- 붙여넣기 SVG‑관련 문자열을 입력합니다.
- 도구가 자동 감지 형식을 판단합니다.
- 가장 가까운 프리셋을 선택 (또는 기본값 그대로 유지).
- 결과를 즉시 미리보기합니다.
- 필요할 경우 고급 설정을 조정합니다.
- SVG를 다운로드하거나 코드/보고서를 복사합니다.
왜 모든 것을 클라이언트‑사이드에서 유지할까?
- 속도 – 디코딩과 정리가 즉시 이루어져 서버를 기다릴 필요가 없습니다.
- 프라이버시 – 원본 SVG가 사용자의 브라우저를 떠나지 않습니다.
- 확장성 – 일반적인 경우(일반 Base64 또는 원시 SVG)에는 백엔드 부하가 없습니다.
오직 비용이 많이 드는 래스터‑트레이싱 단계만 서버가 필요하며, 적절한 스로틀링으로 격리됩니다.
주요 설정 (Cricut 요구 사항에 맞춤)
| 설정 | 기능 설명 | 사용 시점 |
|---|---|---|
| 스크립트 및 메타데이터 제거 | <script>와 <style> 태그를 제거합니다. | 거의 항상 – 파일을 업로드하기 안전하게 유지합니다. |
| 크기 정규화 | 고정된 width/height를 반응형 viewBox로 교체합니다. | 크기가 하드코딩되어 있어 스케일링이 깨지는 SVG에 적용합니다. |
| 단일 색상 강제 | 모든 fill/stroke를 사용자가 선택한 단일 색상으로 변환합니다. | 간단한 비닐 컷 파일에 사용합니다. |
| 색상 보존 | 원본 색상을 그대로 유지합니다. | 다색 또는 프린트‑후‑컷 프로젝트에 사용합니다. |
| 래스터 이미지 유지/제거 | <image> 태그를 선택적으로 유지합니다. | 프린트‑후‑컷에는 유지, 순수 벡터 컷에는 제거합니다. |
| 경로 전용 출력 | 텍스트, 그룹 등 비경로 요소를 모두 제거합니다. | 벡터 경로만 필요할 때 사용합니다. |
참고: 모든 설정이 모든 프로젝트에 적합한 것은 아닙니다. 프리셋은 합리적인 기본값을 선택하며, 사용자는 이후에 세부 조정을 할 수 있습니다.
요약
Base64 → SVG for Cricut 도구는 디코더 이상의 기능을 제공합니다. 이 도구는:
- 모든 SVG 관련 입력(데이터 URL, 원시 Base64, 원시 마크업 또는 래스터 이미지)을 처리합니다.
- Cricut 요구 사항에 맞춘 즉각적인 클라이언트‑사이드 정리를 수행합니다.
- 프리셋 기반의 간편함과 고급 제어를 제공하여 파워 유저도 활용할 수 있습니다.
- 미리보기, 다운로드, 복사 및 보고 작업을 제공하여 사용자가 결과를 즉시 활용할 수 있습니다.
- 비용이 많이 드는 래스터 트레이싱 경로를 별도로 분리하고 속도 제한을 두어, 일반적인 경우 빠르고 서버 부하 없이 동작하도록 합니다.
이 모든 것이 깔끔하고 사용자 친화적인 UI에 구현되어, Cricut 디자이너가 즉시 가져올 수 있는 SVG를 최소한의 마찰로 얻을 수 있게 합니다.
Overview
페이지가 원시 개발자 도구처럼 보이기보다 실제 워크플로우 도구처럼 느껴지도록 재디자인되었습니다.
Core Idea
- Technical task: Decode Base64 into SVG.
- User task: “인코딩되었거나 지저분한 것이 있는데, 사용 가능한 Cricut SVG 파일이 필요해요.”
이 두 작업은 동일하지 않으므로, 도구가 그 간극을 메워야 했습니다.
Design Changes
- Input detection – 원시 SVG, 데이터 URL, 일반 Base64, 혹은 Base64 안에 숨겨진 래스터 이미지를 인식합니다.
- Cleanup presets – Cricut 전용 경고와 자동 수정을 제공합니다.
- Preview behavior – 디코딩된 SVG를 즉시 표시하고, 크기와 경로 수를 함께 보여줍니다.
- Actions – 다운로드와 복사 버튼을 눈에 잘 띄고 접근하기 쉽게 배치합니다.
- Advanced settings – 사용자가 명시적으로 확장하기 전까지는 접힌 상태로 유지합니다.
이러한 선택은 단순 변환기가 아니라 워크플로우‑지향 유틸리티처럼 느껴지게 합니다.
User‑Centric Content
페이지는 이제 사용자가 실제로 마주치는 문제들을 설명합니다. 예를 들어:
- 가져온 후 폰트가 바뀌는 경우.
- 벡터화가 필요한 임베디드 이미지.
- “Print‑then‑cut” 선택.
- 단색 컷 파일.
- SVG가 Cricut 사용에 충분히 깨끗한지 여부.
단순히 “Base64를 붙여넣고 SVG를 다운로드”라고 말하는 대신, 깨끗하고 Cricut‑준비된 SVG를 얻기 위해 필요한 단계들을 안내합니다.
Key Features
- Input detection – 입력 유형을 자동으로 식별하고 적절한 처리 경로를 선택합니다.
- Decoding / Tracing – Base64를 디코딩하거나, 래스터 이미지가 감지되면 트레이싱 루틴을 실행해 벡터 출력물을 생성합니다.
- Live preview – SVG를 즉시 보여주며, 크기와 경로‑수 정보를 표시합니다.
- Copy / Download – SVG 코드를 복사하거나 파일을 다운로드할 수 있는 눈에 띄는 버튼을 제공합니다.
- Collapsed advanced settings – 기본적으로 숨겨져 있으며, 고급 사용자를 위해 확장할 수 있습니다.
Takeaway
Base64‑to‑SVG는 단순 유틸리티가 사람들이 실제로 붙여넣는 지저분한 입력을 인식하고 실용적인 정리 옵션을 제공할 때 얼마나 더 유용해지는지를 보여주는 작은 예시입니다.
향후 iLoveSVG 도구들의 목표도 동일합니다: 순수 포맷 변환을 넘어 사용자가 정확히 필요한 파일을 얻을 수 있도록 돕는 작은 워크플로우‑특화 유틸리티로 나아가는 것.
Try it now: Base64 to SVG for Cricut (link placeholder)