{"id":3377,"date":"2016-11-24T17:59:25","date_gmt":"2016-11-24T09:59:25","guid":{"rendered":"http:\/\/blog.hoyo.idv.tw\/?p=3377"},"modified":"2023-02-01T10:44:27","modified_gmt":"2023-02-01T02:44:27","slug":"canvas-framework","status":"publish","type":"post","link":"https:\/\/blog.hoyo.idv.tw\/?p=3377","title":{"rendered":"Canvas framework"},"content":{"rendered":"<p>--<\/p>\n<ul>\n<li><a href=\"http:\/\/fabricjs.com\/\" target=\"_blank\" rel=\"noopener\">Fabric.js<br \/>\n<img loading=\"lazy\" class=\"alignnone size-medium wp-image-3378\" src=\"http:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-344-300x195.png\" alt=\"image-344\" width=\"300\" height=\"195\" srcset=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-344-300x195.png 300w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-344-768x498.png 768w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-344-462x300.png 462w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-344.png 1011w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><br \/>\n<\/a><\/li>\n<li><a href=\"http:\/\/paperjs.org\/\" target=\"_blank\" rel=\"noopener\">Paper.js<br \/>\n<img loading=\"lazy\" class=\"alignnone size-medium wp-image-3379\" src=\"http:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-343-300x156.png\" alt=\"image-343\" width=\"300\" height=\"156\" srcset=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-343-300x156.png 300w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-343-768x399.png 768w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-343-500x260.png 500w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-343.png 791w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><br \/>\n<\/a><\/li>\n<li><a href=\"http:\/\/canvasjs.com\/\" target=\"_blank\" rel=\"noopener\">HTML5 JavaScript Charts<br \/>\n<img loading=\"lazy\" class=\"alignnone \" src=\"http:\/\/canvasjs.com\/wp-content\/uploads\/2012\/10\/CanvasJS-HTML5-&amp;-JavaScript-Charts.png\" alt=\"\" width=\"297\" height=\"127\" \/><br \/>\n<\/a><\/li>\n<li><a href=\"http:\/\/konvajs.github.io\/\" target=\"_blank\" rel=\"noopener\">Konva.js<br \/>\n<img loading=\"lazy\" class=\"alignnone size-medium wp-image-3381\" src=\"http:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-345-300x146.png\" alt=\"image-345\" width=\"300\" height=\"146\" srcset=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-345-300x146.png 300w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-345-768x373.png 768w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-345-1024x497.png 1024w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-345-500x243.png 500w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-345.png 1052w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><br \/>\n<\/a><\/li>\n<\/ul>\n<p>--<\/p>\n<p>\u61c9\u7528<\/p>\n<ul>\n<li><a href=\"http:\/\/www.letztroll.com\/#!\/create\/\" target=\"_blank\" rel=\"noopener\">http:\/\/www.letztroll.com\/#!\/create\/<\/a><\/li>\n<li><a href=\"https:\/\/www.chrome.com\/racer\" target=\"_blank\" rel=\"noopener\">https:\/\/www.chrome.com\/racer<\/a><\/li>\n<\/ul>\n<p>--<\/p>\n<h2>hoyo \u81ea\u5df1\u7684\u61c9\u7528<\/h2>\n<p>\u9700\u6c42\u70ba\u5f9e\u4e3b\u6a5f\u8f09\u5165\u4e00\u5f35\u5716\u4e4b\u5f8c\uff0c\u53ef\u4ee5\u589e\u52a0\u7bad\u982d\u3001\u6587\u5b57\u3001\u65b9\u6846\u7b49\u57fa\u672c\u7684\u7e6a\u5716\u9700\u6c42\uff0c\u7de8\u8f2f\u5b8c\u6210\u6309\u5132\u5b58\u5f8c\u8981\u76f4\u63a5\u56de\u5b58\u3002<\/p>\n<p>\u6280\u8853\uff1aHTML5 Canvas<\/p>\n<p>\u4f7f\u7528\u5de5\u5177\uff1aFabric.js<\/p>\n<p>\u53c3\u8003<\/p>\n<ul>\n<li><a href=\"http:\/\/stackoverflow.com\/questions\/35630508\/add-delete-button-on-element-in-canvas-fabric-js\">Add Delete button on element in Canvas Fabric JS<\/a><\/li>\n<\/ul>\n<p><img loading=\"lazy\" class=\"alignnone size-medium wp-image-3382\" src=\"http:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-346-286x300.png\" alt=\"image-346\" width=\"286\" height=\"300\" srcset=\"https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-346-286x300.png 286w, https:\/\/blog.hoyo.idv.tw\/wp-content\/uploads\/2016\/11\/Image-346.png 416w\" sizes=\"(max-width: 286px) 100vw, 286px\" \/><\/p>\n<pre class=\"lang:default decode:true \">&lt;!DOCTYPE html&gt;\r\n&lt;html&gt;\r\n&lt;head&gt;\r\n    &lt;meta charset=\"UTF-8\"&gt;\r\n    &lt;title&gt;&lt;\/title&gt;\r\n    &lt;script src=\"..\/js\/jquery-2.2.4.min.js\"&gt;&lt;\/script&gt;\r\n    &lt;script src=\"..\/js\/fabric.min.js\"&gt;&lt;\/script&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n\r\n&lt;canvas id=\"c\" style=\"border: 1px solid #999;\"&gt;&lt;\/canvas&gt;\r\n\r\n&lt;button onclick=\"addText()\"&gt;\u589e\u52a0\u6587\u5b57&lt;\/button&gt;\r\n&lt;button onclick=\"addBlock()\"&gt;\u589e\u52a0\u65b9\u6846&lt;\/button&gt;\r\n&lt;button onclick=\"addLine2()\"&gt;\u589e\u52a0\u7bad\u982d&lt;\/button&gt;\r\n&lt;button onclick=\"saveImage()\"&gt;\u5132\u5b58&lt;\/button&gt;\r\n\r\n&lt;script&gt;\r\n    var canvas = new fabric.Canvas('c');\r\n\r\n    var HideControls = {\r\n        'tl':true,\r\n        'tr':false,\r\n        'bl':true,\r\n        'br':true,\r\n        'ml':true,\r\n        'mt':true,\r\n        'mr':true,\r\n        'mb':true,\r\n        'mtr':true\r\n    };\r\n\r\n    var image = new Image();\r\n    image.src = 'normal_3206.png';\r\n    image.onload = function() {\r\n\r\n        \/\/ create a wrapper around native canvas element (with id=\"c\")\r\n        canvas.setHeight(image.width).setWidth(image.height);\r\n\r\n        canvas.setBackgroundImage('normal_3206.png', canvas.renderAll.bind(canvas), {\r\n            width: canvas.width,\r\n            height: canvas.height,\r\n            \/\/ Needed to position backgroundImage at 0\/0\r\n            originX: 'left',\r\n            originY: 'top'\r\n        });\r\n    };\r\n\r\n    canvas.renderAll();\r\n\r\n    function addDeleteBtn(x, y){\r\n        $(\".deleteBtn\").remove();\r\n        var btnLeft = x-10;\r\n        var btnTop = y-10;\r\n        var deleteBtn = '&lt;img src=\"..\/images\/delete-icon.png\" class=\"deleteBtn\" style=\"position:absolute;top:'+btnTop+'px;left:'+btnLeft+'px;cursor:pointer;width:20px;height:20px;\"\/&gt;';\r\n        $(\".canvas-container\").append(deleteBtn);\r\n    }\r\n\r\n    canvas.on('object:selected',function(e){\r\n        addDeleteBtn(e.target.oCoords.tr.x, e.target.oCoords.tr.y);\r\n    });\r\n\r\n    canvas.on('mouse:down',function(e){\r\n        if(!canvas.getActiveObject())\r\n        {\r\n            $(\".deleteBtn\").remove();\r\n        }\r\n    });\r\n\r\n    canvas.on('object:modified',function(e){\r\n        addDeleteBtn(e.target.oCoords.tr.x, e.target.oCoords.tr.y);\r\n    });\r\n\r\n    canvas.on('object:scaling',function(e){\r\n        $(\".deleteBtn\").remove();\r\n    });\r\n    canvas.on('object:moving',function(e){\r\n        $(\".deleteBtn\").remove();\r\n    });\r\n    canvas.on('object:rotating',function(e){\r\n        $(\".deleteBtn\").remove();\r\n    });\r\n    $(document).on('click',\".deleteBtn\",function(){\r\n        if(canvas.getActiveObject())\r\n        {\r\n            canvas.remove(canvas.getActiveObject());\r\n            $(\".deleteBtn\").remove();\r\n        }\r\n    });\r\n\r\n    \/\/ ----------------------------------------\r\n\r\n    function addBlock(){\r\n        var rect = new fabric.Rect({\r\n            stroke: 'rgb(255,0,0)',\r\n            strokeWidth: 3,\r\n            width: 100, height: 40,\r\n            fill: false, left: 50, top: 50\r\n        }).setControlsVisibility(HideControls);\r\n\r\n        canvas.add(rect);\r\n    }\r\n\r\n    function addText() {\r\n        var t = new fabric.IText('Tap and Type', {\r\n            fontFamily: 'arial black',\r\n            left: 100,\r\n            top: 100\r\n        });\r\n\r\n        var textWithBackground = new fabric.IText('\u8f38\u5165\u6587\u5b57', {\r\n            left: 50,\r\n            top: 50,\r\n            textBackgroundColor: 'rgb(255,255,255)'\r\n        }).setControlsVisibility(HideControls);\r\n        canvas.add(textWithBackground);\r\n    }\r\n\r\n    function addLine2(){\r\n        var path = new fabric.Path('M512 246.16H36.504l86.98-87.43v-27.895L0 254.943v2.115l123.474 124.107h.01V353.26l-86.98-87.42H512z', {\r\n                    stroke: 'rgb(255,255,255)',\r\n                    strokeWidth: 8,\r\n                    fill: 'rgb(255,0,0)'\r\n                }\r\n        ).scaleToWidth(100).setControlsVisibility(HideControls);\r\n\r\n        canvas.add(path);\r\n    }\r\n\r\n    \/\/ \u9001\u51fa\u8655\u7406\u5f8c\u5716\u50cf\u7d66 PHP\r\n    function saveImage() {\r\n        request = new XMLHttpRequest();\r\n        request.open('POST', 'c1.php', true);\r\n\r\n        var $Json = {};\r\n        $Json['image'] = canvas.toDataURL();\r\n        $Json['id'] = 'aa111';\r\n        request.send( JSON.stringify($Json) );\r\n    }\r\n\r\n&lt;\/script&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;<\/pre>\n<p>&nbsp;<\/p>\n<p>--<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p class=\"pvc_stats all \" data-element-id=\"3377\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> &nbsp;2,092&nbsp;total views<\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"excerpt":{"rendered":"<p>-- Fabric.js Pa...<\/p>\n<div class=\"pvc_clear\"><\/div>\n<p class=\"pvc_stats all \" data-element-id=\"3377\" style=\"\"><i class=\"pvc-stats-icon medium\" aria-hidden=\"true\"><svg aria-hidden=\"true\" focusable=\"false\" data-prefix=\"far\" data-icon=\"chart-bar\" role=\"img\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" viewBox=\"0 0 512 512\" class=\"svg-inline--fa fa-chart-bar fa-w-16 fa-2x\"><path fill=\"currentColor\" d=\"M396.8 352h22.4c6.4 0 12.8-6.4 12.8-12.8V108.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v230.4c0 6.4 6.4 12.8 12.8 12.8zm-192 0h22.4c6.4 0 12.8-6.4 12.8-12.8V140.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v198.4c0 6.4 6.4 12.8 12.8 12.8zm96 0h22.4c6.4 0 12.8-6.4 12.8-12.8V204.8c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v134.4c0 6.4 6.4 12.8 12.8 12.8zM496 400H48V80c0-8.84-7.16-16-16-16H16C7.16 64 0 71.16 0 80v336c0 17.67 14.33 32 32 32h464c8.84 0 16-7.16 16-16v-16c0-8.84-7.16-16-16-16zm-387.2-48h22.4c6.4 0 12.8-6.4 12.8-12.8v-70.4c0-6.4-6.4-12.8-12.8-12.8h-22.4c-6.4 0-12.8 6.4-12.8 12.8v70.4c0 6.4 6.4 12.8 12.8 12.8z\" class=\"\"><\/path><\/svg><\/i> &nbsp;2,092&nbsp;total views<\/p>\n<div class=\"pvc_clear\"><\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[262],"tags":[251,252,42],"_links":{"self":[{"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/3377"}],"collection":[{"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=3377"}],"version-history":[{"count":6,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/3377\/revisions"}],"predecessor-version":[{"id":11440,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=\/wp\/v2\/posts\/3377\/revisions\/11440"}],"wp:attachment":[{"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.hoyo.idv.tw\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}