PerfectVector
Di Irene Kim9 min di lettura

Importazione SVG Fabric.js: grafica modificabile

Importa SVG in Fabric.js come oggetti modificabili, ricolora una parte ed esporta una copia SVG verificata. Segui un esempio provato e distingui i problemi del sorgente dai bug dell'API.

In questa pagina

Per importare SVG modificabili in Fabric.js, attendi loadSVGFromString() o loadSVGFromURL(), poi aggiungi gli oggetti restituiti a un canvas. Mantieni un riferimento alla parte da modificare, cambiane il riempimento ed esporta con canvas.toSVG(). Caricare la grafica come immagine offre un modello di modifica diverso: selezionare quell'immagine non espone ogni regione colorata come forma separata.

La distinzione conta per un configuratore di prodotti, un editor di distintivi o un'icona ricolorabile. Servono oggetti corrispondenti ai pezzi che l'utente può cambiare. Un file che termina in .svg non garantisce quella struttura.

Questa guida pratica usa Fabric.js 7.4.0 e una piccola lampada scritta a mano. Verifica tre forme attraverso importazione, ricolorazione ed esportazione. È un esempio di codice originale, non una conversione PerfectVector né un'affermazione che ogni funzionalità SVG sopravviva allo stesso percorso.

Scegli il modello di oggetti prima del caricatore

Fabric.js analizza l'SVG e lo trasforma nei propri oggetti canvas. Modifichi quegli oggetti tramite l'API Fabric; non sono elementi DOM SVG attivi dentro il canvas. L'attuale riferimento loadSVGFromString documenta una promessa che restituisce il risultato dell'analisi e una funzione reviver che riceve ogni elemento sorgente e l'oggetto creato.

AttivitàPunto di partenza utileControllo prima di continuare
Cambiare forme separateAnalizzare l'SVG in oggetti FabricLa regione da modificare esiste come oggetto proprio
Spostare la grafica come un'unitàRaggruppare deliberatamente gli oggetti analizzatiModifica dei figli e selezione funzionano come previsto
Inserire un'illustrazione senza modificarne le partiUsare una procedura per immaginiUna singola immagine selezionabile è sufficiente
Ricolorare grafica disponibile soltanto come PNG o JPGPreparare prima geometria vettorialeLe regioni ricalcate corrispondono alle modifiche necessarie

Non dedurre la struttura degli oggetti dall'aspetto. Due colori possono appartenere a tracciati separati, mentre diverse isole scollegate possono appartenere a un solo tracciato. La guida alla separazione dei gruppi SVG spiega quella diagnosi del file sorgente.

Esegui un piccolo esempio di importazione, ricolorazione ed esportazione

Inizia in una cartella vuota. Installa la dipendenza nella versione fissata:

npm install --save-exact fabric@7.4.0

Salva questo codice come index.html:

<!doctype html>
<html lang="en">
<meta charset="utf-8">
<title>Fabric SVG import test</title>
<canvas id="editor" width="320" height="240"></canvas>
<button id="recolor">Recolor shade</button>
<button id="export">Export SVG</button>
<div id="output"></div>
<pre id="report"></pre>
<script type="module" src="main.js"></script>
</html>

Salva questo codice come main.js. Il percorso relativo del modulo permette a questo piccolo esempio di funzionare senza uno strumento di impacchettamento. In un'applicazione che lo usa, importa gli stessi nomi da fabric.

import { Canvas, loadSVGFromString } from './node_modules/fabric/dist/index.min.mjs';
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="320" height="240" viewBox="0 0 320 240">
  <path id="shade" fill="#e6a23c" d="M115 40 H205 L230 135 H90 Z"/>
  <rect id="stem" x="151" y="135" width="18" height="57" fill="#214c54"/>
  <path id="base" fill="#214c54" d="M110 192 H210 L220 210 H100 Z"/>
</svg>`;
const canvas = new Canvas('editor', { width: 320, height: 240 });
const parts = new Map();
const parsed = await loadSVGFromString(svg, (element, object) => {
  const id = element.getAttribute('id');
  if (id) parts.set(id, object);
});
canvas.add(...parsed.objects.filter(Boolean));
canvas.requestRenderAll();
function report(exported) {
  const xml = new DOMParser().parseFromString(exported, 'image/svg+xml');
  const data = {
    version: '7.4.0',
    importedObjects: canvas.getObjects().length,
    types: canvas.getObjects().map(object => object.type),
    shadeFill: parts.get('shade').fill,
    exportedPaths: xml.querySelectorAll('path').length,
    exportedRects: xml.querySelectorAll('rect').length,
    exportedImages: xml.querySelectorAll('image').length,
  };
  document.querySelector('#report').textContent = JSON.stringify(data, null, 2);
  document.querySelector('#output').innerHTML = exported;
}
document.querySelector('#recolor').onclick = () => {
  parts.get('shade').set('fill', '#397e86');
  canvas.requestRenderAll();
  document.querySelector('#report').textContent = 'Shade recolored. Export to check delivery SVG.';
};
document.querySelector('#export').onclick = () => report(canvas.toSVG());
report(canvas.toSVG());

Servi la cartella tramite HTTP invece di aprire direttamente il file HTML. Per esempio, se Python è installato, esegui python3 -m http.server 8000 e apri http://localhost:8000. Fai clic su Recolor shade, poi su Export SVG. Il pulsante renderizza la stringa esportata sotto il canvas; non scarica un file.

Questa dimostrazione inserisce nell'anteprima soltanto l'esportazione del proprio esempio fisso. Non riusare quell'anteprima innerHTML come gestore generale di caricamento per SVG non attendibili. L'esempio omette inoltre gestione degli errori e convalida dei file a livello di applicazione.

La mappa acquisisce gli ID sorgente durante l'analisi. La ricolorazione individua il paralume tramite quel riferimento esplicito, invece di presumere che il primo oggetto restituito sia sempre la parte desiderata. In un editor di produzione, decidi come memorizzare quegli identificatori e riferimenti quando salvi e riapri un documento.

Cosa ha mostrato la prova

Il nostro esempio è stato importato come tre oggetti: path, rect e path. Dopo che il paralume è passato da #e6a23c a #397e86, l'anteprima esportata ha mostrato il nuovo paralume mentre stelo e base mantenevano il riempimento scuro originale. L'esportazione conteneva due tracciati, un rettangolo e nessun elemento image.

Dimostrazione locale reale di Fabric.js con lampada ricolorata sul canvas, anteprima SVG esportata corrispondente e rapporto di tre oggetti importati senza immagini esportate
Cattura autentica dell'esempio scritto a mano in Fabric.js 7.4.0 dopo ricolorazione ed esportazione. Queste osservazioni riguardano le tre forme semplici verificate qui.

Questi controlli dimostrano che l'esempio rimane geometria vettoriale dopo l'esportazione. Non dimostrano la conservazione dell'XML originale, dei gruppi, delle regole CSS o di ogni funzionalità usata da un altro file. Conserva l'originale e confronta una copia da consegnare nell'applicazione che la riceverà.

Evita di mescolare tutorial con callback e API a promesse

Gli esempi meno recenti chiamano spesso fabric.loadSVGFromString(svg, callback) e si aspettano che la callback riceva l'intero array di oggetti. Non è il ruolo del secondo argomento nell'API attuale: è un reviver per singolo oggetto. Attendi il risultato dell'analisi per ottenere la raccolta completa.

La guida di migrazione a Fabric 6.0 spiega il passaggio alle importazioni con nome e alle API a promesse. Controlla la versione del pacchetto installato prima di adattare un vecchio frammento; sostituire soltanto l'istruzione di importazione lascia sbagliata la logica di caricamento.

Per un file SVG della stessa origine, il punto di partenza equivalente è:

import { loadSVGFromURL } from 'fabric';
const parsed = await loadSVGFromURL('/artwork.svg');
canvas.add(...parsed.objects.filter(Boolean));
canvas.requestRenderAll();

La documentazione loadSVGFromURL osserva che recupera l'SVG e deve rispettare la politica della stessa origine. Se l'host remoto non consente la tua origine, cambiare il codice di raggruppamento non correggerà il problema di rete. Prova prima un file servito dalla tua applicazione, poi ispeziona la richiesta fallita e la configurazione CORS del server remoto.

Controlla la modificabilità separatamente dall'aspetto

Un rendering riuscito risponde a una domanda: è apparso qualcosa? Un editor richiede altri controlli.

  1. Seleziona la regione che deve cambiare. Conferma che un'altra parte non cambi insieme ad essa.
  2. Ricolora tramite il metodo set dell'oggetto e richiedi un rendering, come nell'esempio.
  3. Esporta e apri il risultato indipendentemente. L'API Canvas.toSVG di Fabric genera markup SVG dallo stato del canvas.
  4. Ispeziona tutto ciò da cui dipende la grafica effettiva, come tratti, ritaglio, gradienti, testo o trasformazioni annidate. Il semplice esempio sopra non verifica queste funzionalità.
  5. Salva, riapri e ripeti la modifica prevista nel tuo editor prima di considerare completa la procedura.

Se l'importazione produce un oggetto immagine, esamina il sorgente alla ricerca di un raster incorporato. La guida al contenuto raster dentro SVG mostra perché un contenitore SVG non fornisca tracciati modificabili ai pixel. Se il sorgente ha già forme vettoriali utilizzabili, lavora sull'importazione e sull'organizzazione degli oggetti invece di ricalcarlo ancora.

Quando la grafica raster richiede una conversione a monte

Se l'unico sorgente è un PNG o JPG piatto e gli utenti devono modificarne le regioni colorate, la procedura da immagine a vettore di PerfectVector può aiutare a preparare un candidato SVG. Confronta il risultato con l'originale, ispeziona i tracciati e controlla se le regioni necessarie sono modificabili indipendentemente prima di importarlo in Fabric.js.

Il ricalco non assegna significati specifici dell'applicazione come paralume, stelo o base. I nomi del nostro esempio sono stati creati deliberatamente. Aggiungi la tua mappatura delle parti e le regole di modifica dopo aver ispezionato la geometria convertita. Per un insieme riutilizzabile di icone, la procedura da PNG a SVG per kit UI tratta preparazione del sorgente e controlli di coerenza.

Mantieni raster le fotografie quando devono rimanere fotografie. Mantieni un SVG originale adatto quando contiene già le forme necessarie. La panoramica sulla vettorializzazione può aiutare a decidere se il ricalco debba far parte della procedura.

FAQ

Fabric.js importa SVG come tracciati modificabili? Può analizzare contenuti SVG supportati e trasformarli in oggetti Fabric. La modificabilità dipende dalla struttura sorgente: un tracciato, un gruppo di forme e un raster incorporato non forniscono le stesse opzioni di modifica. Ispeziona gli oggetti restituiti e prova il cambiamento specifico necessario.

Perché un vecchio esempio loadSVGFromString non funziona? I vecchi tutorial potrebbero aspettarsi una callback di completamento come secondo argomento. L'API attuale restituisce una promessa e usa quell'argomento come reviver per singolo oggetto. Adatta il codice alla versione installata e attendi il risultato dell'analisi.

toSVG conserva esattamente il file originale? Non aspettarti un documento sorgente identico. Genera SVG dallo stato del canvas Fabric. Conserva l'originale e verifica l'aspetto esportato e le strutture necessarie alla procedura ricevente.

Importare un PNG può renderne modificabili le singole regioni? Inserire un PNG non lo ricalca in regioni vettoriali separate. Se quelle modifiche sono necessarie, prepara prima geometria vettoriale adatta, ispeziona le parti risultanti e definiscine i ruoli nell'applicazione.

Fonti

  1. Fabric.js — loadSVGFromString — Valore restituito come promessa e contratto del reviver per elemento sorgente e oggetto.
  2. Fabric.js — Aggiornamento a Fabric.js 6.0 — Importazioni con nome e migrazione dalle callback alle promesse.
  3. Fabric.js — loadSVGFromURL — Analisi da URL e vincoli di recupero della stessa origine.
  4. Fabric.js — API Canvas — Esportazione dello stato del canvas in markup SVG.

Se il pezzo mancante è geometria modificabile da grafica raster, prepara un candidato SVG con PerfectVector. Controlla prima le forme, poi dimostra che l'editor Fabric.js può ricolorare la parte prevista ed esportare correttamente il risultato.

Altro dal blog

Riparti da un SVG più pulito
e facile da modificare