Rád pracuji s knihovnou fabric.js. Obsluha canvasu je díky tomu výrazně efektivnější. Narážím přirozeně na řadu úskalí. Tak například zde jsem musel řešit klonování objektů z jednoho canvasu do druhého, což bylo docela komplikované vzhledem k nutnosti zajistit, aby obrázky byly načtené ve správném pořadí. Na canvasu záleží na pořadí objektů, protože jde defacto o vrstvy, kdy jedna může nechtěně překrýt druhou.

Chcete-li zajistit, aby se objekty klonovaly na druhý canvas ve stejném pořadí, v jakém jsou zobrazeny na původním, je třeba upravit strategii klonování. Problémem je asynchronní načítání obrázků, které může narušit pořadí při jejich přidávání na canvas.

Řešením je nejprve naklonovat všechny objekty (včetně obrázků) a poté je přidat do kopie v původním pořadí, jakmile je klonování všech objektů dokončeno. Toho lze dosáhnout sledováním klonovaných objektů a jejich pořadí a jejich přidáním až po naklonování všech objektů.

Když klonujete objekt ve Fabric.js, musí být plně načten, aby proces klonování fungoval správně. Protože se obrázky načítají asynchronně, může se stát, že se funkce klonování spustí dříve, než je obrázek plně načten, což má za následek, že se obrázek na kopii nenachází.

Chcete-li zajistit, aby byl obraz také naklonován, musíte zajistit, aby klonování proběhlo až po úplném načtení obrazu. Jedním ze způsobů, jak to řešit, je spustit proces klonování ve zpětném volání funkce fabric.Image.fromURL, čímž se zajistí, že obrázek bude načten před zahájením klonování. Jedná se o zpětnovazební smyčku callback.

 

Funkce cloneToExportCanvas obsahuje logiku pro asynchronní načítání obrázků. Zajišťuje, aby se každý obrázek před klonováním znovu a plně načetl.
Čítač (loadedCount) sleduje, kolik objektů bylo úspěšně naklonováno. Jakmile jsou všechny objekty (včetně obrázků) naklonovány, je zavolána funkce zpětného volání (callback()). Toto zpětné volání pak může zpracovat export.
V exportExportCanvasAsPNG nyní export probíhá uvnitř zpětného volání funkce cloneToExportCanvas, což zajišťuje, že všechny objekty včetně obrázků jsou naklonovány před exportem.

Tento přístup zajistil, že všechny objekty, včetně asynchronně načtených obrázků, jsou na exportCanvas přítomny dříve, než dojde k exportu do PNG. Problém vyřešen.