Oh MyUtils

SVG Blob 생성기 - 유기적 블롭 도형 생성 온라인 도구

모던 웹 디자인을 위한 유기적 SVG 블롭 도형 생성

자주 묻는 질문

SVG 블롭 생성기란 무엇인가요?

SVG 블롭 생성기는 SVG(Scalable Vector Graphics) 형식으로 랜덤한 유기적 형태의 도형("블롭")을 만드는 도구입니다. 이러한 도형은 원 주위에 랜덤한 점들을 분포시키고 부드러운 곡선으로 연결하여 수학적으로 생성됩니다. 블롭은 부드럽고 유기적인 외관 때문에 배경, 히어로 섹션, 카드 장식, 브랜딩 요소 등 현대 웹 디자인에서 널리 사용됩니다.

이 SVG 블롭 생성기는 어떻게 사용하나요?

1. 복잡도 슬라이더를 조정하여 블롭의 곡선 수를 제어합니다 (높을수록 복잡한 형태). 2. 랜덤 슬라이더를 조정하여 형태의 불규칙성을 제어합니다 (높을수록 유기적인 형태). 3. SVG viewBox 크기를 설정합니다. 4. 채우기 타입(단색 또는 그라디언트)을 선택하고 색상을 지정합니다. 5. 랜덤 생성 버튼을 클릭하여 다양한 블롭을 생성합니다. 6. 마음에 드는 형태를 찾으면 SVG 코드를 복사하거나 SVG/PNG 파일을 다운로드합니다.

디자인 데이터는 안전한가요? 서버로 전송되나요?

디자인 데이터는 100% 안전하며 브라우저를 벗어나지 않습니다. 모든 블롭 생성은 JavaScript 수학 알고리즘을 사용하여 클라이언트 측에서 수행됩니다. 어떤 데이터도 서버로 전송되지 않습니다. 따라서 독점 브랜드 작업이나 기밀 디자인 프로젝트에도 안전하게 사용할 수 있습니다.

복잡도와 랜덤의 차이는 무엇인가요?

복잡도는 블롭을 생성하는 데 사용되는 제어점의 수를 조절합니다. 점이 많을수록 더 많은 곡선과 디테일이 있는 형태가 만들어지고, 점이 적을수록 더 단순하고 둥근 형태가 됩니다. 랜덤은 각 점이 완벽한 원에서 얼마나 벗어나는지를 조절합니다. 낮은 랜덤은 거의 원형에 가까운 형태를, 높은 랜덤은 불규칙하고 유기적인 형태를 만듭니다.

생성된 SVG를 웹 프로젝트에 사용할 수 있나요?

네, 생성된 SVG 코드는 모든 웹 프로젝트에서 직접 사용할 수 있습니다. HTML에 인라인으로 삽입하거나, React/Vue 컴포넌트로 사용하거나, 외부 SVG 파일로 참조하거나, data URI를 통해 CSS background-image로 사용할 수 있습니다. SVG는 표준을 준수하며 모든 최신 브라우저에서 작동합니다.

웹 디자인에서 SVG 블롭의 일반적인 사용 사례는 무엇인가요?

SVG 블롭은 히어로 섹션 배경, 카드 및 컨테이너 장식, 이미지 마스크 및 클립 패스, 로딩/플레이스홀더 애니메이션, 로고 및 브랜딩 요소, 섹션 구분선, 떠다니는 장식 요소, 그라디언트 배경 등에 널리 사용됩니다. 유기적인 형태는 직사각형 위주의 웹 레이아웃에 시각적 흥미와 현대적인 느낌을 더합니다.

블롭에 PNG나 JPEG 대신 SVG 형식을 사용하는 이유는 무엇인가요?

SVG(Scalable Vector Graphics)는 여러 장점을 제공합니다: 품질 손실 없이 무한 확대 축소 가능, 래스터 이미지에 비해 작은 파일 크기, 코드를 통한 쉬운 색상 커스터마이징, CSS/JS 애니메이션 지원, 기본적으로 투명한 배경, 텍스트 기반 마크업이므로 SEO 친화적. SVG 블롭은 어떤 화면 크기나 해상도에서도 선명하게 유지됩니다.

코드 예제

// Generate an organic SVG blob shape in JavaScript

// Seeded random number generator (Mulberry32)
function createSeededRandom(seed) {
    return function () {
        seed |= 0;
        seed = (seed + 0x6d2b79f5) | 0;
        let t = Math.imul(seed ^ (seed >>> 15), 1 | seed);
        t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
        return ((t ^ (t >>> 14)) >>> 0) / 4294967296;
    };
}

// Generate blob points using polar coordinates with random deviation
function generateBlobPoints(numPoints, radius, randomness, seed) {
    const rng = createSeededRandom(seed);
    const points = [];
    const angleStep = (Math.PI * 2) / numPoints;

    for (let i = 0; i < numPoints; i++) {
        const theta = i * angleStep;
        const deviation = 1 + (rng() - 0.5) * (randomness / 50);
        const r = radius * deviation;
        points.push({
            x: Math.cos(theta) * r,
            y: Math.sin(theta) * r,
        });
    }
    return points;
}

// Convert points to smooth SVG path using Catmull-Rom spline
function pointsToSvgPath(points, center) {
    const n = points.length;
    let d = `M ${points[0].x + center} ${points[0].y + center}`;

    for (let i = 0; i < n; i++) {
        const p0 = points[(i - 1 + n) % n];
        const p1 = points[i];
        const p2 = points[(i + 1) % n];
        const p3 = points[(i + 2) % n];

        const cp1x = p1.x + (p2.x - p0.x) / 6;
        const cp1y = p1.y + (p2.y - p0.y) / 6;
        const cp2x = p2.x - (p3.x - p1.x) / 6;
        const cp2y = p2.y - (p3.y - p1.y) / 6;

        d += ` C ${cp1x + center} ${cp1y + center}, ${cp2x + center} ${cp2y + center}, ${p2.x + center} ${p2.y + center}`;
    }
    return d + " Z";
}

// Generate complete SVG string
function generateBlobSvg(options = {}) {
    const {
        seed = Math.floor(Math.random() * 100000),
        complexity = 8,
        randomness = 50,
        size = 400,
        color = "#6366f1",
    } = options;

    const center = size / 2;
    const radius = size * 0.35;
    const points = generateBlobPoints(complexity, radius, randomness, seed);
    const path = pointsToSvgPath(points, center);

    return `<svg viewBox="0 0 ${size} ${size}" xmlns="http://www.w3.org/2000/svg">
  <path d="${path}" fill="${color}" />
</svg>`;
}

// Usage
const svg = generateBlobSvg({
    seed: 42,
    complexity: 10,
    randomness: 60,
    size: 400,
    color: "#8b5cf6",
});
console.log(svg);
document.getElementById("blob-container").innerHTML = svg;

관련 도구