ããã¯ããªãŒãã³Javascriptãã£ã³ãã¹ã©ã€ãã©ãªFabric.jsã«é¢ããäžé£ã®èšäºã®ç¬¬3éšã®ç¿»èš³ã§ãããã®ã·ãªãŒãºã®
第1éšãš
第2éšã§ã¯ãåºæ¬çãªFabricçŽ æã®å€§éšåãåãäžããŸããã ãã®èšäºã§ã¯ããã詳现ãªè³æãæäŸããŸãã
ã°ã«ãŒã

æåã«è©±ãã®ã¯ã°ã«ãŒãã§ãã ãªããžã§ã¯ãã®ã°ã«ãŒãåã¯ãFabricã§æã匷åãªããŒã«ã®1ã€ã§ãã ãªããžã§ã¯ããã°ã«ãŒãåããå¿
èŠãããã®ã¯ãªãã§ããïŒ å
šäœãšããŠå€ãã®ãªããžã§ã¯ããæ±ãããã«èšããŸã§ããªãã
ããŠã¹ã§ãªããžã§ã¯ããããã€
ã°ã«ãŒãåãããèŠããŠããŸããïŒ ã°ã«ãŒãåãããšãè²ãéæåºŠããã¬ãŒã ãªã©ã®å€èгããããã£ãåæã«ç§»åãæ¡å€§çž®å°ãå転ãããã«ã¯å€æŽããããšãã§ããŸãã
ãã®ããã«ã°ã«ãŒãããããŸãã ãã£ã³ãã¹äžã§éžæç¯å²ã衚瀺ãããã³ã«ïŒäžã®å³ã®ããã«ïŒãFabricã¯ã°ã«ãŒãå
ã§æé»çã«ã°ã«ãŒããäœæãããããããã°ã©ã ã§ã°ã«ãŒããæäœã§ããŸãã ããã
fabric.Group
ã®äž»èŠãªãã€ã³ãã§ãã
åãšããã¹ãã®2ã€ã®ãªããžã§ã¯ãã®ã°ã«ãŒããäœæããŸãã
var circle = new fabric.Circle({ radius: 100, fill: '#eef', scaleY: 0.5, originX: 'center', originY: 'center' }); var text = new fabric.Text('hello world', { fontSize: 30, originX: 'center', originY: 'center' }); var group = new fabric.Group([ circle, text ], { left: 150, top: 100, angle: -10 }); canvas.add(group);
æåã«ãããã¹ããªããžã§ã¯ããhello worldããäœæããŸããã
originX
ããã³
originY
ã
'center'
ã«
originX
ãŸããããã«ããããã®ãªããžã§ã¯ããã°ã«ãŒãå
ã§
'center'
ãŸãã åæèšå®ã§ã¯ãã°ã«ãŒãã¡ã³ããŒã¯ã°ã«ãŒãã®å·Šäžé
ãåºæºã«ããŠé
眮ãããŸãã æ¬¡ã«ãååŸ100pxã®åãã#eefãã®è²ã§å¡ãã€ã¶ããåçŽæ¹åã«å§çž®ããŸããïŒå§çž®ç-0.5ïŒã 次ã«ã2ã€ã®ãã©ã¡ãŒã¿ãŒãæã€
fabric.Group
ãªããžã§ã¯ããäœæããŸããã æåã®ãã©ã¡ãŒã¿ãŒã¯ã2ã€ã®ãªããžã§ã¯ãã®é
åã§ãã 2çªç®ã®ãã©ã¡ãŒã¿ãŒã¯ãã°ã«ãŒãã®äœçœ®150/100ãšè§åºŠ-10ãèšå®ããŸãã æåŸã«ãä»ã®ãªããžã§ã¯ããšåæ§ã«ã
canvas.add()
ã¡ãœããã䜿çšããŠè¿œå ããŸããã
ãããŠåºæ¥äžããïŒ ãã£ã³ãã¹äžã«ãç¢æã®ããæ¥åã®ãããªãªããžã§ã¯ãã衚瀺ãããŸãã ã°ã«ãŒãã®ããããã£ã倿Žããããšã§ç°¡åã«å€æŽã§ããããšã«æ³šæããŠãã ããã ãã®ãªããžã§ã¯ãå
šäœã§äœæ¥ã§ããŸãã

ãã£ã³ãã¹ã«ã°ã«ãŒããã§ããŸããã å°ãå€ããŸãããã
group.item(0).setFill('red'); group.item(1).set({ text: 'trololo', fill: 'white' }); canvas.renderAll();
ããã§äœãèµ·ãã£ãŠããŸããïŒ
item()
ã¡ãœããã䜿çšããŠã°ã«ãŒãå
ã®ãªããžã§ã¯ãã«ã¢ã¯ã»ã¹ããããããã£ã倿ŽããŸããã æåã®ãªããžã§ã¯ãã¯å§çž®ãããåã§ã2çªç®ã®ãªããžã§ã¯ãã¯ããã¹ãã§ãã äœãèµ·ãã£ãã®ãèŠãŠã¿ãŸãããïŒ

ããªããããããæ°ã¥ããéèŠãªããšã¯ãã°ã«ãŒãå
ã®ãªããžã§ã¯ããã°ã«ãŒãã®äžå¿ã«æããããŠããããšã§ãã ããã¹ããªããžã§ã¯ãã®ã©ãã«ã倿Žããå Žåãå¹
ã倿ŽããåŸã§ãäžå€®ã«é
眮ããããŸãŸã§ããã ãã®åäœã¯ããªããžã§ã¯ãã®åº§æšïŒå·Š\äžïŒãèšå®ããããšã§ãã£ã³ã»ã«ã§ããŸãã
3ã€ã®åãäœæããŠã°ã«ãŒãåããæ¬¡ã
ã«æ°Žå¹³ã«é
眮ããŸãã
var circle1 = new fabric.Circle({ radius: 50, fill: 'red', left: 0 }); var circle2 = new fabric.Circle({ radius: 50, fill: 'green', left: 100 }); var circle3 = new fabric.Circle({ radius: 50, fill: 'blue', left: 200 }); var group = new fabric.Group([ circle1, circle2, circle3 ], { left: 200, top: 100 }); canvas.add(group);

ã°ã«ãŒãã§äœæ¥ããå Žå
ããªããžã§ã¯ãã®
ç¶æ
ã«æ³šæãæãå¿
èŠã
ãããŸã ã ããšãã°ãã€ã¡ãŒãžã®ã°ã«ãŒãã圢æããå Žåãããããå®å
šã«ããŒããããŠããããšã確èªããå¿
èŠããããŸãã 幞ããªããšã«ãFabricã«ã¯æ¢è£œã®ãœãªã¥ãŒã·ã§ã³ããããŸãã
fabric.Image.fromURL('/assets/pug.jpg', function(img) { var img1 = img.scale(0.1).set({ left: 100, top: 100 }); fabric.Image.fromURL('/assets/pug.jpg', function(img) { var img2 = img.scale(0.1).set({ left: 175, top: 175 }); fabric.Image.fromURL('/assets/pug.jpg', function(img) { var img3 = img.scale(0.1).set({ left: 250, top: 250 }); canvas.add(new fabric.Group([ img1, img2, img3], { left: 200, top: 200 })) }); }); });

ã°ã«ãŒãã«ã¯ããã«ããã€ãã®éèŠãªæ¹æ³ããããŸãã
fabric.Canvas#getObjects()
ãšåãããã«
fabric.Canvas#getObjects()
ããã°ã«ãŒãå
ã®ãã¹ãŠã®ãªããžã§ã¯ãã®é
åãè¿ã
getObjects()
ã¡ãœããã ã°ã«ãŒãå
ã®ãã¹ãŠã®ãªããžã§ã¯ãã®æ°ã瀺ã
size()
ã¡ãœããããããŸãã ã°ã«ãŒãå
ã®ç¹å®ã®ãªããžã§ã¯ãã®ååšã確èªãã
contains()
ã¡ãœããããã
contains()
ã åè¿°ã®
item()
ã¡ãœãããã°ã«ãŒãããç¹å®ã®ãªããžã§ã¯ããååŸã§ããŸãã
forEachObject()
ã¡ãœãã
fabric.Canvas#forEachObject
ãšåæ§ã«
fabric.Canvas#forEachObject
ããã°ã«ãŒãã®ã¿ã§æ©èœããŸãã æåŸã«ã
add()
ããã³
remove()
ã¡ãœããã¯ãããããã°ã«ãŒãã«ãªããžã§ã¯ãã远å ããã³åé€ããŸãã
ã°ã«ãŒãã«ãªããžã§ã¯ãã远å /åé€ããã«ã¯ã2ã€ã®æ¹æ³ããããŸãã ã°ã«ãŒãã®äœçœ®/ãµã€ãºã®æŽæ°ãããšãªãã
ã°ã«ãŒãã®äžå¿ã«é·æ¹åœ¢ã远å ããŸãã
group.add(new fabric.Rect({ ... originX: 'center', originY: 'center' }));
ã°ã«ãŒãã®äžå¿ãã100pxã®é·æ¹åœ¢ã远å ããŸãã
group.add(new fabric.Rect({ ... left: 100, top: 100, originX: 'center', originY: 'center' }));
ã°ã«ãŒãã®äžå¿ã«é·æ¹åœ¢ã远å ããã°ã«ãŒããµã€ãº
ãæŽæ°ããŸãã
group.addWithUpdate(new fabric.Rect({ ... left: group.getLeft(), top: group.getTop(), originX: 'center', originY: 'center' }));
ã°ã«ãŒãã®äžå¿ãã100pxã®é·æ¹åœ¢ã远å ããã°ã«ãŒãã®ãµã€ãºãæŽæ°ããŸãã
group.addWithUpdate(new fabric.Rect({ ... left: group.getLeft() + 100, top: group.getTop() + 100, originX: 'center', originY: 'center' }));
æ¢ã«ãã£ã³ãã¹äžã«ãããªããžã§ã¯ãã®ã°ã«ãŒããäœæããã«ã¯ãããããè€è£œããŠããã°ã«ãŒãåããå¿
èŠããããŸãã
é£èŒ
ããšãã°ããŠãŒã¶ãŒããã£ã³ãã¹ã®ã³ã³ãã³ããä¿åã§ããããã«ããããå¥ã®ã¯ã©ã€ã¢ã³ãã«ãããŒããã£ã¹ããããããæ©èœãå®è£
ããå Žåã¯ããã£ã³ãã¹ã
ã·ãªã¢ã«åããå¿
èŠã
ãããŸã ã ãã£ã³ãã¹ã³ã³ãã³ããéä¿¡ããã«ã¯ã©ãããã°ããã§ããïŒ ãã¡ããããã£ã³ãã¹å
šäœãç»åã«ãšã¯ã¹ããŒãããããšãã§ããŸããããµãŒããŒã«ç»åãã¢ããããŒãããã®ã¯é¢åã§äžäŸ¿ã§ãã Fabricãç§ãã¡ããšãŠã幞ãã«ããŠãããããããã³ã³ãã³ããããã¹ãã«ç¿»èš³ããæ¹ãã¯ããã«ç°¡åã§ãã
ã¡ãœããtoObjectãtoJSON
Fabrisã§ã®ã·ãªã¢ã«åã®åºç€ã¯ã
fabric.Canvas#toObject()
ããã³
fabric.Canvas#toJSON()
ã§ãã
空ã®ãã£ã³ãã¹ãã·ãªã¢ã«åããäŸãèŠãŠã¿ãŸãããã
var canvas = new fabric.Canvas('c'); JSON.stringify(canvas);
ES5
JSON.stringify()
ã¡ãœããã䜿çšããŸãããã®ã¡ãœãããååšããå Žåããªããžã§ã¯ãã®
toJSON
ã¡ãœãããåŒã³åºããŸãã Fabricã®ãã£ã³ãã¹ãªããžã§ã¯ãã«ã¯ãã®ã¡ãœãããããã
JSON.stringify(canvas.toJSON())
ãåŒã³åºãã®ãšåçã§ãã
空ã®ãã£ã³ãã¹ãè¡šãæ»ãæååãèããŸãã JSON圢åŒã§ããããããã㣠''ãªããžã§ã¯ã ''ããã³ ''ããã¯ã°ã©ãŠã³ã ''ã§æ§æãããŸãã ãã£ã³ãã¹ã«ã¯äœããªããããããªããžã§ã¯ããããããã£ã¯çŸåšç©ºã§ãããèæ¯ãã«ã¯åæéæå€ããããŸãïŒãrgbaïŒ0ã0ã0ã0ïŒãïŒã
ãã£ã³ãã¹ãå¥ã®èæ¯ã«èšå®ããã©ã®ãããªå€åããããã確èªããŸãã
canvas.backgroundColor = 'red'; JSON.stringify(canvas);
äºæ³ã©ããããã£ã³ãã¹ãã¥ãŒã«ã¯å¥ã®èæ¯ãå«ãŸããããã«ãªããŸããã ããã§ã¯ãããã€ãã®ãªããžã§ã¯ãã远å ããŠã¿ãŸãããã
canvas.add(new fabric.Rect({ left: 50, top: 50, height: 20, width: 20, fill: 'green' })); console.log(JSON.stringify(canvas));
...ã³ã³ãœãŒã«ã«åºåãããŸãïŒ
'{"objects":[{"type":"rect","left":50,"top":50,"width":20,"height":20,"fill":"green","overlayFill":null,"stroke":null,"strokeWidth":1,"strokeDashArray":null,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"selectable":true,"hasControls":true,"hasBorders":true,"hasRotatingPoint":false,"transparentCorners":true,"perPixelTargetFind":false,"rx":0,"ry":0}],"background":"rgba(0, 0, 0, 0)"}'
ããïŒ äžèŠãå€ãã®ããšã倿ŽãããŠããŸããã詳ããèŠãŠã¿ããšããã®æ°ãããªããžã§ã¯ããJSONã§ã·ãªã¢ã«åãããããªããžã§ã¯ããé
åã®äžéšã«ãªã£ãŠããããšãããããŸãã ãã®èª¬æã«ã¯ã座æšãå¹
ãé«ããå¡ãã€ã¶ããªã©ã®ãã¹ãŠã®èŠèŠçãªã³ã³ããŒãã³ããå«ãŸããŠããããšã«æ³šæããŠãã ããã èµ€ãåãªã©ã®å¥ã®ãªããžã§ã¯ãã远å ããé·æ¹åœ¢ã®åŸãã«é
眮ãããšãããã«å¿ããŠçµæãå€ãããŸãã
canvas.add(new fabric.Circle({ left: 100, top: 100, radius: 50, fill: 'red' })); console.log(JSON.stringify(canvas));
...ã³ã³ãœãŒã«ã«åºåãããŸãïŒ
'{"objects":[{() "type":"rect","left":50,"top":50,"width":20,"height":20,"fill":"green","overlayFill":null,"stroke":null,"strokeWidth":1,"strokeDashArray":null,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"selectable":true,"hasControls":true,"hasBorders":true,"hasRotatingPoint":false,"transparentCorners":true,"perPixelTargetFind":false,"rx":0,"ry":0},{() "type":"circle","left":100,"top":100,"width":100,"height":100,"fill":"red","overlayFill":null,"stroke":null,"strokeWidth":1,"strokeDashArray":null,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"selectable":true,"hasControls":true,"hasBorders":true,"hasRotatingPoint":false,"transparentCorners":true,"perPixelTargetFind":false,"radius":50}],"background":"rgba(0, 0, 0, 0)"}'
ãããã®ãªããžã§ã¯ãã®éå§äœçœ®ã瀺ãããã«ã
"type":"rect"
ããã³
"type":"circle"
ã匷調衚瀺ããŸããã ç·ãé·ãããããã«èŠãããããããŸããããç»åãã·ãªã¢ã«åããã®ã«æ¯ã¹ãŠããããã¯ãŸã è±ã§ãã æ¯èŒã®ããã«ã
canvas.toDataURL('png')
ã¡ãœãããè¿ã1/10ïŒïŒïŒè¡ãèŠãŠãã ããã
'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAK8CAYAAAAXo9vkAAAgAElEQVR4Xu3dP4xtBbnG4WPAQOQ2YBCLK1qpoQE1/m+NVlCDwUACicRCEuysrOwkwcJgAglEItRQaWz9HxEaolSKtxCJ0FwMRIj32zqFcjm8e868s2fNWo/Jygl+e397rWetk5xf5pyZd13wPwIECBAgQIAAAQIECBxI4F0H++Qb134R/U2fevC8q+5esGWESBAgAABAgQIEFiOwPL/MC5AlvO0OBMCBAgQIECAAAECJxQQICcE9HYCBAgQIECAAAECBPYXECD7W3klAQIECBAgQIAAAQInFBAgJwT0dgIECBAgQIAAAQIE9hcQIPtbeSUBAgQIECBAgAABAicUECAnBPR2AgQIECBAgAABAgT2FxAg+1t5JQECBAgQIECAAAECJxQQICcE9HYCBAgQIECAAAECBPYXECD7W3klAQIECBAgQIAAAQInFBAgJwTc9+3z49yvmNd+dI7PzPHJOW6Y4wNzXD3HlXNc9pZdb85/vzbHK3P8aY7n5vj1HL+Y43dz417f97O9jgABAgQIECBAgMBSBATIKd2JCY5dWNwyx5fn+PwcV5U/6tXZ99M5fjjHk3Mjd6HifwQIECBAgAABAgQWLSBAirdnouP6WXfvHHfOcU1x9T6rXp4XPTLHA3NTX9jnDV5DgAABAgQIECBA4NACAuSE4hMdl8+Kr83xzTmuO+G61ttfnEXfnuN7c4PfaC21hwABAgQIECBAgMBJBQTIJQpOeFw7b71/jtsvccWh3vbYfNB9c6NfOtQH+hwCBAgQIECAAAECFxMQIMd8No7C4+F5283HfOtZv/ypOYG7hMhZ3wafT4AAAQIECBDYtoAA2fP+H/1Vqwd3f4jf8y1Lfdkunu7xV7OWenucFwECBAgQIEBg3QICZI/7O/Fxx7xs9wf3t36r3D3evciX7L7F7+6rIY8u8uycFAECBAgQIE'
ããã«ã17,000æå ã
äžèŠã
fabric.Canvas#toObject
ã¡ãœããããã1ã€
fabric.Canvas#toObject
çç±ã¯æããã§ã¯ãããŸããã ç°¡åã§ã
toObject
ã¯ããªããžã§ã¯ããšããŠã®ã¿
toJSON
ãšåã衚çŸãè¿ããŸãã ããšãã°ãã³ã³ãã³ããç·è²ã®é·æ¹åœ¢ã®ãã£ã³ãã¹ã䜿çšããŸãã
canvas.toObject()
ã¯ã³ã³ãœãŒã«ã«åºåããŸãïŒ
{ "background" : "rgba(0, 0, 0, 0)", "objects" : [ { "angle" : 0, "fill" : "green", "flipX" : false, "flipY" : false, "hasBorders" : true, "hasControls" : true, "hasRotatingPoint" : false, "height" : 20, "left" : 50, "opacity" : 1, "overlayFill" : null, "perPixelTargetFind" : false, "scaleX" : 1, "scaleY" : 1, "selectable" : true, "stroke" : null, "strokeDashArray" : null, "strokeWidth" : 1, "top" : 50, "transparentCorners" : true, "type" : "rect", "width" : 20 } ] }
ã芧ã®ãšããã
toJSON
ã®åºåã¯ã
toObject
æååã®ç¿»èš³ã«ãããŸããã
toObject
ã¡ãœãã
toObject
ãã¹ããŒãã§æ
toObject
ãšããç¹
toObject
è峿·±ãã䟿å©ã§ãã é
åã«è¡šç€ºãããã®ã¯ããã¹ãŠã®ãã£ã³ãã¹ãªããžã§ã¯ããå埩åŠçãã
toObject
ã¡ãœããã
toObject
å§ä»»ãã
toObject
ã§ãã
fabric.Path
ã¯ã©ã¹
fabric.Path
ã¯ç¬èªã®
toObject
ããã㯠''ãã€ã³ã ''ã®é
åãè¿ããŸãã ãŸãã
fabric.Image
ããã®ã¡ãœããããããç»åã® `` src ''ããããã£ãè¿ããŸãã OOPã®ãã¿ãŒã³ã«åŸã£ãŠãåãªããžã§ã¯ãã¯èªèº«ãã·ãªã¢ã«åããæ¹æ³ãç¥ã£ãŠããŸãã
ã€ãŸããç¬èªã®ãã¯ã©ã¹ããäœæããå ŽåããŸãã¯ãªããžã§ã¯ãã®ã·ãªã¢ã«åããã衚çŸã倿Žããå Žåã¯ããã®æ©èœã§äžæžããŸãã¯æ¡åŒµã§ãã
toObject
ã¡ãœãããå¿
èŠã§ãã
äŸãèŠãŠã¿ãŸãããïŒ
var rect = new fabric.Rect(); rect.toObject = function() { return { name: 'trololo' }; }; canvas.add(rect); console.log(JSON.stringify(canvas));
...ã³ã³ãœãŒã«ã«åºåãããŸãïŒ
'{"objects":[{"name":"trololo"}],"background":"rgba(0, 0, 0, 0)"}'
ã芧ã®ãšãããããªããžã§ã¯ããé
åã«ã¯ãåè§åœ¢ã®è¡šçŸã倿ŽãããŠããŸãã ãã ãããã®æ¹æ³ã§æžãæããããšã¯
toObject
远å ã®ããããã£ã§
toObject
ã®æ©èœã
æ¡åŒµããã®ãšã¯ç°ãªããããŸãæçšã§ã¯ãªãããšããããããŸãã
var rect = new fabric.Rect(); rect.toObject = (function(toObject) { return function() { return fabric.util.object.extend(toObject.call(this), { name: this.name }); }; })(rect.toObject); canvas.add(rect); rect.name = 'trololo'; console.log(JSON.stringify(canvas));
...ã³ã³ãœãŒã«ã«åºåãããŸãïŒ
'{"objects":[{"type":"rect","left":0,"top":0,"width":0,"height":0,"fill":"rgb(0,0,0)","overlayFill":null,"stroke":null,"strokeWidth":1,"strokeDashArray":null,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"selectable":true,"hasControls":true,"hasBorders":true,"hasRotatingPoint":false,"transparentCorners":true,"perPixelTargetFind":false,"rx":0,"ry":0,"name":"trololo"}],"background":"rgba(0, 0, 0, 0)"}'
远å ã®ãããã㣠'' name ''ã䜿çšããŠããªããžã§ã¯ãã®æ¢åã®
toObject
ã¡ãœãããæ¡åŒµããŸããã çŸåšãã¡ãœããåŒã³åºãã®çµæãšããŠååšããŠããŸãã ãã®ããã«æ©èœãæ¡åŒµããå Žåããªããžã§ã¯ãïŒãã®å Žåã¯
fabric.Rect
ïŒã®ãã¯ã©ã¹ãã«ã¯ãé
å '' stateProperties ''ã«æ°ãã远å ãããããããã£ãå«ãŸããŠããå¿
èŠãããããšã«æ³šæããŠãã ããã ãã®å Žåã®ã¿ããã¹ãŠãæ£ããæ©èœããŸãã
ToSVGã¡ãœãã
ãã£ã³ãã¹ã®ãã1ã€ã®ããã¹ã衚çŸã¯ãSVG圢åŒã§ãã Fabricã¯SVGã®è§£æãšãã£ã³ãã¹äžã®è¡šç€ºãå°éãšããŠããŸãã ããã«ããããã£ã³ãã¹ããSVGã«ããŸãã¯ãã®éã«å€æããæ©èœãæäŸãããŸãã åãé·æ¹åœ¢ããã£ã³ãã¹ã«è¿œå ãã
toSVG
ã¡ãœããã®åäœã確èªããŸãã
canvas.add(new fabric.Rect({ left: 50, top: 50, height: 20, width: 20, fill: 'green' })); console.log(canvas.toSVG());
...ã³ã³ãœãŒã«ã«åºåãããŸãïŒ
'<?xml version="1.0" standalone="no" ?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="800" height="700" xml:space="preserve"><desc>Created with Fabric.js 0.9.21</desc><rect x="-10" y="-10" rx="0" ry="0" width="20" height="20" style="stroke: none; stroke-width: 1; stroke-dasharray: ; fill: green; opacity: 1;" transform="translate(50 50)" /></svg>'
toJSON
ã
toObject
ãšåæ§ã«ã
toSVG
ã¯ãã£ã³ãã¹ã§åŒã³åºããããšããã®ããžãã¯ãåãªããžã§ã¯ãã«å§ä»»ããåãªããžã§ã¯ãã¯åã¿ã€ãã®ãªããžã§ã¯ãã«åºæã®ç¬èªã®
toSVG
ã¡ãœãããæã¡ãŸãã
toSVG
ã¡ãœããã倿ŽãŸãã¯æ¡åŒµããå¿
èŠãããå Žåã¯ã
toSVG
ã¡ãœãããšåãæ¹æ³ã§å€æŽã§ããŸãã
toObject/toJSON
ãšæ¯èŒããSVGãã¬ãŒã³ããŒã·ã§ã³ã®å©ç¹ã¯ãSVGã¬ã³ããªã³ã°ãå¯èœãªä»»æã®ããã€ã¹ïŒãã©ãŠã¶ãŒãã¢ããªã±ãŒã·ã§ã³ãããªã³ã¿ãŒãã«ã¡ã©ãªã©ïŒãšé£æºã§ããããšã§ãã toObject / toJSONã¡ãœããã§ã¯ãæåã«ãã¥ãŒããã£ã³ãã¹ã«ããŒãããå¿
èŠããããŸãã ãã£ã³ãã¹ãžã®èªã¿èŸŒã¿ãšããã°ã canvasã®ã³ã³ãã³ããããã¹ãã«ã·ãªã¢ã«åã§ããŸãããã©ã®ããã«ããŒããçŽãããšãã§ããŸããïŒ
éã·ãªã¢ã«åãSVGããŒãµãŒ
ã·ãªã¢ã«åã®å Žåãšåæ§ã«ãæååãããã£ã³ãã¹ãããŒãããã«ã¯ãJSONãã¥ãŒãšSVGãã¥ãŒããã®2ã€ã®æ¹æ³ããããŸãã JSONã«ã¯
fabric.Canvas#loadFromJSON
ããã³
fabric.Canvas#loadFromDatalessJSON
ã¡ãœããããããŸãã SVGã®å Žå-ã¡ãœãã
fabric.loadSVGFromURL
ããã³
fabric.loadSVGFromString
ã
æåã®2ã€ã®ã¡ãœããã¯ãã£ã³ãã¹ã§åŒã³åºãããä»ã®2ã€ã®ã¡ãœããã¯ãã¡ããªãã¯ã§çŽæ¥åŒã³åºãããããšã«æ³šæããŠãã ããã
ãããã®æ¹æ³ã«ã€ããŠç¹å¥ãªããšã¯ãããŸããã ãããã¯æåŸ
ã©ããã«æ©èœããŸãã ããšãã°ãåã®JSONåºåã空ã®ãã£ã³ãã¹ã«é
眮ããŸãã
var canvas = new fabric.Canvas(); canvas.loadFromJSON('{"objects":[{"type":"rect","left":50,"top":50,"width":20,"height":20,"fill":"green","overlayFill":null,"stroke":null,"strokeWidth":1,"strokeDashArray":null,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"selectable":true,"hasControls":true,"hasBorders":true,"hasRotatingPoint":false,"transparentCorners":true,"perPixelTargetFind":false,"rx":0,"ry":0},{"type":"circle","left":100,"top":100,"width":100,"height":100,"fill":"red","overlayFill":null,"stroke":null,"strokeWidth":1,"strokeDashArray":null,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":1,"selectable":true,"hasControls":true,"hasBorders":true,"hasRotatingPoint":false,"transparentCorners":true,"perPixelTargetFind":false,"radius":50}],"background":"rgba(0, 0, 0, 0)"}');
...äž¡æ¹ã®ãªããžã§ã¯ãããã£ã³ãã¹ã«è¡šç€ºãããŸãã

ããŠãæååãããã£ã³ãã¹ãããŒãããããšã¯éåžžã«ç°¡åã§ãããäžèŠçè§£ã§ããªã
loadFromDatalessJSON
ã¡ãœããã¯ã©ãã§ããããïŒ å
ã»ã©äœ¿çšãã
loadFromJSON
ãšã®åºæ¬çãªéãã¯äœã§ããïŒ ãã®ã¡ãœããã®ç®çãçè§£ããã«ã¯ã次ã®ãããªãå€å°è€éãªãã¹ãªããžã§ã¯ãã調ã¹ãå¿
èŠããããŸãã

...ãããŠ
JSON.stringify(canvas)
ã¯ä»¥äžãåºåããŸãïŒ
'{"objects":[{"type":"path","left":184,"top":177,"width":175,"height":151,"fill":"#231F20","overlayFill":null,"stroke":null,"strokeWidth":1,"strokeDashArray":null,"scaleX":1,"scaleY":1,"angle":-19,"flipX":false,"flipY":false,"opacity":1,"selectable":true,"hasControls":true,"hasBorders":true,"hasRotatingPoint":false,"transparentCorners":true,"perPixelTargetFind":false,"path":[["M",39.502,61.823],["c",-1.235,-0.902,-3.038,-3.605,-3.038,-3.605],["s",0.702,0.4,3.907,1.203],["c",3.205,0.8,7.444,-0.668,10.114,-1.97],["c",2.671,-1.302,7.11,-1.436,9.448,-1.336],["c",2.336,0.101,4.707,0.602,4.373,2.036],["c",-0.334,1.437,-5.742,3.94,-5.742,3.94],["s",0.4,0.334,1.236,0.334],["c",0.833,0,6.075,-1.403,6.542,-4.173],["s",-1.802,-8.377,-3.272,-9.013],["c",-1.468,-0.633,-4.172,0,-4.172,0],["c",4.039,1.438,4.941,6.176,4.941,6.176],["c",-2.604,-1.504,-9.279,-1.234,-12.619,0.501],["c",-3.337,1.736,-8.379,2.67,-10.083,2.503],["c",-1.701,-0.167,-3.571,-1.036,-3.571,-1.036],["c",1.837,0.034,3.239,-2.669,3.239,-2.669],["s",-2.068,2.269,-5.542,0.434],["c",-3.47,-1.837,-1.704,-8.18,-1.704,-8.18],["s",-2.937,5.909,-1,9.816],["C",34.496,60.688,39.502,61.823,39.502,61.823],["z"],["M",77.002,40.772],["c",0,0,-1.78,-5.03,-2.804,-8.546],["l",-1.557,8.411],["l",1.646,1.602],["c",0,0,0,-0.622,-0.668,-1.691],["C",72.952,39.48,76.513,40.371,77.002,40.772],["z"],["M",102.989,86.943],["M",102.396,86.424],["c",0.25,0.22,0.447,0.391,0.594,0.519],["C",102.796,86.774,102.571,86.578,102.396,86.424],["z"],["M",169.407,119.374],["c",-0.09,-5.429,-3.917,-3.914,-3.917,-2.402],["c",0,0,-11.396,1.603,-13.086,-6.677],["c",0,0,3.56,-5.43,1.69,-12.461],["c",-0.575,-2.163,-1.691,-5.337,-3.637,-8.605],["c",11.104,2.121,21.701,-5.08,19.038,-15.519],["c",-3.34,-13.087,-19.63,-9.481,-24.437,-9.349],["c",-4.809,0.135,-13.486,-2.002,-8.011,-11.618],["c",5.473,-9.613,18.024,-5.874,18.024,-5.874],["c",-2.136,0.668,-4.674,4.807,-4.674,4.807],["c",9.748,-6.811,22.301,4.541,22.301,4.541],["c",-3.097,-13.678,-23.153,-14.636,-30.041,-12.635],["c",-4.286,-0.377,-5.241,-3.391,-3.073,-6.637],["c",2.314,-3.473,10.503,-13.976,10.503,-13.976],["s",-2.048,2.046,-6.231,4.005],["c",-4.184,1.96,-6.321,-2.227,-4.362,-6.854],["c",1.96,-4.627,8.191,-16.559,8.191,-16.559],["c",-1.96,3.207,-24.571,31.247,-21.723,26.707],["c",2.85,-4.541,5.253,-11.93,5.253,-11.93],["c",-2.849,6.943,-22.434,25.283,-30.713,34.274],["s",-5.786,19.583,-4.005,21.987],["c",0.43,0.58,0.601,0.972,0.62,1.232],["c",-4.868,-3.052,-3.884,-13.936,-0.264,-19.66],["c",3.829,-6.053,18.427,-20.207,18.427,-20.207],["v",-1.336],["c",0,0,0.444,-1.513,-0.089,-0.444],["c",-0.535,1.068,-3.65,1.245,-3.384,-0.889],["c",0.268,-2.137,-0.356,-8.549,-0.356,-8.549],["s",-1.157,5.789,-2.758,5.61],["c",-1.603,-0.179,-2.493,-2.672,-2.405,-5.432],["c",0.089,-2.758,-1.157,-9.702,-1.157,-9.702],["c",-0.8,11.75,-8.277,8.011,-8.277,3.74],["c",0,-4.274,-4.541,-12.82,-4.541,-12.82],["s",2.403,14.421,-1.336,14.421],["c",-3.737,0,-6.944,-5.074,-9.879,-9.882],["C",78.161,5.874,68.279,0,68.279,0],["c",13.428,16.088,17.656,32.111,18.397,44.512],["c",-1.793,0.422,-2.908,2.224,-2.908,2.224],["c",0.356,-2.847,-0.624,-7.745,-1.245,-9.882],["c",-0.624,-2.137,-1.159,-9.168,-1.159,-9.168],["c",0,2.67,-0.979,5.253,-2.048,9.079],["c",-1.068,3.828,-0.801,6.054,-0.801,6.054],["c",-1.068,-2.227,-4.271,-2.137,-4.271,-2.137],["c",1.336,1.783,0.177,2.493,0.177,2.493],["s",0,0,-1.424,-1.601],["c",-1.424,-1.603,-3.473,-0.981,-3.384,0.265],["c",0.089,1.247,0,1.959,-2.849,1.959],["c",-2.846,0,-5.874,-3.47,-9.078,-3.116],["c",-3.206,0.356,-5.521,2.137,-5.698,6.678],["c",-0.179,4.541,1.869,5.251,1.869,5.251],["c",-0.801,-0.443,-0.891,-1.067,-0.891,-3.473]'...
...ãããŠãããã¯ããã¹ãå
šäœã®5çªç®ïŒïŒïŒã®éšåã§ãã
ããã§äœãèµ·ãã£ãŠããŸããïŒ Pathãªããžã§ã¯ãã¯ããã®ãªããžã§ã¯ãã®è¡šç€ºæ¹æ³ãç€ºãæ°çŸã®ããžã§æ²ç·ã·ã³ãã«ã§æ§æãããŠããŸãã JSON圢åŒã®ããããã¹ãŠã®ããŒã
["c",0,2.67,-0.979,5.253,-2.048,9.079]
ã¯ãããããã®æ²ç·ã®åº§æšã§ãã ãããŠããããã®æ²ç·ãæ°çŸãŸãã¯æ°åããå Žåã匊ã®å€§ãããæšæž¬ããããšã¯é£ãããããŸããã
ã©ãããïŒ
fabric.Canvas#toDatalessJSON
ã¡ãœããã
fabric.Canvas#toDatalessJSON
å©ãã«ãªã
fabric.Canvas#toDatalessJSON
ã 詊ããŠã¿ãŸãããïŒ
canvas.item(0).sourcePath = '/assets/dragon.svg'; console.log(JSON.stringify(canvas.toDatalessJSON()));
...ã³ã³ãœãŒã«ã«åºåãããŸãïŒ
{"objects":[{"type":"path","left":143,"top":143,"width":175,"height":151,"fill":"#231F20","overlayFill":null,"stroke":null,"strokeWidth":1,"strokeDashArray":null,"scaleX":1,"scaleY":1,"angle":-19,"flipX":false,"flipY":false,"opacity":1,"selectable":true,"hasControls":true,"hasBorders":true,"hasRotatingPoint":false,"transparentCorners":true,"perPixelTargetFind":false,"path":"/assets/dragon.svg"}],"background":"rgba(0, 0, 0, 0)"}
ãŸããã¯ããã«å°ãªãïŒ ç§ãã¡ã¯äœãããŸãããïŒ
toDatalessJSON
ã¡ãœãããåŒã³åºãåã«ããã¹ïŒãã©ãŽã³ã·ã§ã€ãïŒã®ãsourcePathãããããã£ãã/assets/dragon.svgãã«èšå®ããããšã«æ³šæããŠãã ããã æ¬¡ã«
toDatalessJSON
ã¡ãœãããåŒã³åºãããã®å·šå€§ãªãã¹æååå
šäœãåçŽãªæååã/assets/dragon.svgãã«å€ãããŸããã
倿°ã®è€éãªãã©ãŒã ã䜿çšãã
toDatalessJSON
ã¡ãœããã䜿çšãããšãcanvasã®ããã¹ã衚çŸã倧å¹
ã«åæžãã倧ããªãã¹ããŒã¿ãåçŽãªSVGãªã³ã¯ã«çœ®ãæããããšãã§ããŸãã
loadFromDatalessJSON
ã¡ãœããã«æ»ããšãããããããŒã¿ã®ãªãïŒããŒã¿ã¬ã¹ã®ïŒãã¥ãŒããcanvasãããŒãã§ãããšæšæž¬ããã§ãããã
loadFromDatalessJSON
ã¯ãããã¹ãæååïŒã/assets/dragon.svgããªã©ïŒãããŒããããããããã¹ãªããžã§ã¯ãã®ããŒã¿ãšããŠäœ¿çšã§ããŸãã
SVGãããŒãããæ¹æ³ãèŠãŠã¿ãŸãããã æååãŸãã¯URLã䜿çšã§ããŸãã
fabric.loadSVGFromString('...', function(objects, options) { var obj = fabric.util.groupSVGElements(objects, options); canvas.add(obj).renderAll(); });
æåã®åŒæ°ã¯SVGæååã§ã2çªç®ã¯ã³ãŒã«ããã¯é¢æ°ã§ãã ãã®é¢æ°ã¯ãSVGãèªã¿èŸŒãŸãããšãã«åŒã³åºãããŸãã
objects
ãš
options
2ã€ã®åŒæ°ãåã
options
ã
objects
-SVGããååŸãããªããžã§ã¯ãã®é
å-ãã¹ããã¹ãªããžã§ã¯ãã®ã°ã«ãŒãïŒè€éãªãªããžã§ã¯ãçšïŒãç»åãããã¹ããªã© ããããã¹ãŠã®ãªããžã§ã¯ãã1ã€ã®ã³ã¬ã¯ã·ã§ã³ã«ã°ã«ãŒãåããSVGããã¥ã¡ã³ãã«ããããã«
fabric.util.groupSVGElements
ããã«ã
objects
ãš
options
äž¡æ¹ã«
fabric.util.groupSVGElements
ã䜿çšã
options
ã ãã£ã³ãã¹ã«è¿œå ã§ãã
fabric.Path
ãŸãã¯
fabric.PathGroup
ãªããžã§ã¯ããäœæãããŸãã
fabric.loadSVGFromURL
ãåæ§ã«æ©èœããŸãããSVGã®ã³ã³ãã³ãã§ã¯ãªããURLãå«ãæååã䜿çšããŸãã Fabricã¯XMLHttpRequestãä»ããŠãã®URLãååŸããããšãããããSVGãžã®ãªã³ã¯ã¯SOPã«ãŒã«ã«æºæ ããå¿
èŠãããããšã«æ³šæããŠãã ããã
ãµãã¯ã©ã¹å
Fabricã¯OOPã®ååã«åºã¥ããŠæ§ç¯ãããŠããããããµãã¯ã©ã¹ãç°¡åã«äœæããã³äœæãããªããžã§ã¯ãã®æ©èœãæ¡åŒµã§ããŸãã ã·ãªãŒãºã®æåã®éšåãããããããã«ãFabricã«ã¯ãªããžã§ã¯ãã®å³å¯ãªéå±€ããããŸãã ãã¹ãŠã®2Dãªããžã§ã¯ãïŒãã¹ãç»åãããã¹ããªã©ïŒã¯
fabric.Object
ããç¶æ¿ãã
fabric.Object
ãªã©ã®äžéšã®ãã¯ã©ã¹ãã¯3ã¬ãã«ã®ç¶æ¿ããæã£ãŠããŸãã
Fabricã®æ¢åã®ãã¯ã©ã¹ãããµãã¯ã©ã¹åããã®ã¯ã©ãã§ããïŒ ãŸãã¯ãæ°ãããã¯ã©ã¹ããäœæããŸããïŒ
ãããè¡ãã«ã¯ãjavascriptã®éåžžã®ãããã¿ã€ãç¶æ¿ãåçŽã«æœè±¡åãã
fabric.util.createClass
ã¡ãœãããå¿
èŠã§ãã æåã«ãåçŽãªãã¯ã©ã¹ããã€ã³ããäœæããŸãã
var Point = fabric.util.createClass({ initialize: function(x, y) { this.x = x || 0; this.y = y || 0; }, toString: function() { return this.x + '/' + this.y; } });
createClass
ã¯ãªããžã§ã¯ããåãåãããã®ããããã£ãæ°ãããã¯ã©ã¹ãã®ãªããžã§ã¯ãã®ããããã£ãšããŠäœ¿çšããŸãã '' initialize ''ã¯ã³ã³ã¹ãã©ã¯ã¿ãŒãšããŠäœ¿çšãããŸãã ãããã£ãŠãPointãåæåãããšãã«ããããã㣠'' x ''ã '' y ''ãããã³ã¡ãœãã '' toString ''ãæã€æ°ãããªããžã§ã¯ããäœæããŸãã
var point = new Point(10, 20); point.x;
ãã¯ã©ã¹ããã€ã³ãã®åå«ãããšãã°è²ä»ãã®ãã€ã³ããäœæããå Žåã
createClass
ã䜿çšããŸãã
var ColoredPoint = fabric.util.createClass(Point, { initialize: function(x, y, color) { this.callSuper('initialize', x, y); this.color = color || '#000'; }, toString: function() { return this.callSuper('toString') + ' (color: ' + this.color + ')'; } });
ç¶æ¿çšã®ãªããžã§ã¯ãã2çªç®ã®åŒæ°ãšããŠäœ¿çšãããããã«ãªããŸãããæåã®åŒæ°ã¯ããã®ãªããžã§ã¯ãã®èŠªã«ãªããã¯ã©ã¹ããã€ã³ãã§ãã éè€ãé¿ããããã«ã芪ã®ãã¯ã©ã¹ãã§ã¡ãœãããåŒã³åºã
callSuper
ã¡ãœããã䜿çšããŸãã ããã¯ãPointã倿Žãããšã倿Žã
ColoredPoint
ã圱é¿ããããšãæå³ããŸãã äŸãèŠãŠã¿ãŸãããïŒ
var redPoint = new ColoredPoint(15, 33, '#f55'); redPoint.x;
ããã§ãç¬èªã®ãã¯ã©ã¹ããšããµãã¯ã©ã¹ããäœæããæ¹æ³ãããããŸããããFabricã§æ¢åã®ãã®ã䜿çšããããšãã§ããŸãã ããšãã°ããã¯ã©ã¹ã
LabeledRect
äœæããŸããããã¯ãç¢æã®ããé·æ¹åœ¢ã«ãªããŸãã ãã¯ã©ã¹ãã®ã€ã³ã¹ã¿ã³ã¹ããã£ã³ãã¹ã«è¡šç€ºããããšãã©ãã«ã¯é·æ¹åœ¢ã®å
åŽã«è¡šç€ºãããŸãã ãã°ã«ãŒããã®ç« ã§ãã§ã«æ€èšããé¡äŒŒã®å
容ïŒåãšããã¹ãïŒã ãšããã§ãFabricã§äœæ¥ããŠãããšãã«ãã°ã«ãŒããšãã¯ã©ã¹ãã®äž¡æ¹ã䜿çšããŠæœè±¡åãããã§äœæã§ããããšã«æ°ä»ãããšãã§ããŸãã
var LabeledRect = fabric.util.createClass(fabric.Rect, { type: 'labeledRect', initialize: function(options) { options || (options = { }); this.callSuper('initialize', options); this.set('label', options.label || ''); }, toObject: function() { return fabric.util.object.extend(this.callSuper('toObject'), { label: this.get('label') }); }, _render: function(ctx) { this.callSuper('_render', ctx); ctx.font = '20px Helvetica'; ctx.fillStyle = '#333'; ctx.fillText(this.label, -this.width/2, -this.height/2 + 20); } });
ã³ãŒãã¯è€éã«èŠãããããããŸããããéåžžã«åçŽã§ãã
æåã«ã衚瀺æ©èœã远å ããããã«ã芪ã®ãã¯ã©ã¹ãã
fabric.Rect
ãšããŠ
fabric.Rect
ããŸãã æ¬¡ã«ããããã㣠'' type ''ãå®çŸ©ããå€ '' labeledRect ''ã«èšå®ããŸãã ããã¯ãFabricã¢ãŒããã¯ãã£ã«åãããããã«è¡ãããŸããããã«ãããã¹ãŠã®ãªããžã§ã¯ãã«ã¯ããtypeãïŒé·æ¹åœ¢ãåããã¹ãããã¹ããªã©ïŒã®ããããã£ãããããã§ãã
ã³ã³ã¹ãã©ã¯ã¿ãŒïŒ
initialize
ïŒã¯æ¢ã«ããªãã¿ã§ã
callSuper
ãåŒã³åºãã
callSuper
ã§
initialize
ãåŒã³åºã
initialize
ã ããã«ã
options
ããå€ãååŸããŠããªããžã§ã¯ãã«ç¢æïŒã©ãã«ïŒãä»ã
options
ã
ãã®çµæã2ã€ã®ã¡ãœããleft-
toObject
ãš
_render
ãŸãã
toObject
ãã·ãªã¢ã«åã®ç« ããæãåºãããã«ããªããžã§ã¯ãã衚ã責任ããããŸãã
LabeledRect
ã¯éåžžã®rectãšåãããããã£ããããããåçŽã«ã©ãã«ã远å ããããšã§èŠª
toObject
ã¡ãœãããæ¡åŒµããŸããã
_render
ã¡ãœããã«é¢ããŠã¯ããªããžã§ã¯ããçŽæ¥ã¬ã³ããªã³ã°ãã責任ããããŸãã ããã¯ãé·æ¹åœ¢ãã£ã¹ãã¬ã€ïŒ
callSuper
ïŒãšè¿œå ã®ããã¹ã衚瀺ããžãã¯ã§æ§æãããŠããŸãã
ããŠããã®ãããªãªããžã§ã¯ãã衚瀺ãããå ŽåïŒ
var labeledRect = new LabeledRect({ width: 100, height: 50, left: 100, top: 100, label: 'test', fill: '#faa' }); canvas.add(labeledRect);
...次ã®ããã«ãªããŸãïŒ

ããããã£ïŒã©ãã«ãªã©ïŒã倿ŽãããšãæåŸ
ãããçµæãçæãããŸãã
labeledRect.set({ label: 'trololo', fill: '#aaf', rx: 10, ry: 10 });

å¿
èŠã«å¿ããŠããã¯ã©ã¹ãã®åäœã倿Žã§ããŸãã ããšãã°ãã³ã³ã¹ãã©ã¯ã¿ã§ããäžåºŠèšå®ããªãããã«ããã©ã«ãå€ã远å ããŸãã ãŸãã¯ããªããžã§ã¯ãã§ã«ã¹ã¿ã ããããã£ã䜿çšå¯èœã«ããŸãã 远å ã®ããããã£ãã«ã¹ã¿ã ã«ããå Žåããããã
toObject
ã«å
¥ããŠ
initialize
ïŒ
... initialize: function(options) { options || (options = { }); this.callSuper('initialize', options);
ããã§ãã·ãªãŒãºã®ç¬¬3éšã¯çµããã§ãã ããã§ãã°ã«ãŒãããã¯ã©ã¹ããããµãã¯ã©ã¹ããããã³ïŒãïŒã·ãªã¢ã«åã®ã¢ã€ãã¢ãåŸãããŸããã ãã®èšäºã§ç޹ä»ããè³æããFabricã®ããè€éãªåé¡ã®è§£æ±ºã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã
ã·ãªãŒãºã®ç¬¬4éšã§ã¯ãããã«å€ãã®æ
å ±ãæç€ºãããŸãã
æåãšéçºã®æåïŒ
翻蚳ã¯ãèè
ã®åæãšçŽæ¥ã®åå ã§è¡ãããŸããã ãœãŒã¹ãžã®ãªã³ã¯ ã