{"id":134,"date":"2010-08-02T12:29:24","date_gmt":"2010-08-02T12:29:24","guid":{"rendered":"http:\/\/patternweaver.com\/blog\/?p=134"},"modified":"2010-08-02T12:32:06","modified_gmt":"2010-08-02T12:32:06","slug":"imagebooth-recap-multilayered-imageeditor-in-pure-javascript","status":"publish","type":"post","link":"http:\/\/patternweaver.com\/blog\/2010\/08\/imagebooth-recap-multilayered-imageeditor-in-pure-javascript\/","title":{"rendered":"ImageBooth Recap: Multilayered ImageEditor in pure Javascript"},"content":{"rendered":"<p>As I&#8217;ve been finishing features, I&#8217;ve just been updating what the new stuff is&#8230; but now that I have a working implementation of layers (though save isn&#8217;t yet linked to layers), I figure it&#8217;s time to stop and give an overall view of the ImageBooth Demo app and what it does.<\/p>\n<p>When you open it up you see a vanilla image editor interface. What is important to note, is there is an internal compositing framework outputting to 1 canvas in the end, with ImageBooth using many canvases internally for layer and render buffers. Also, the 4 main interfaces(Brushes, Tools, Filters and Operations) are all pluggable, so it&#8217;s simple to contribute.<\/p>\n<p><img decoding=\"async\" src=\"http:\/\/patternweaver.com\/Graphics\/ImageBooth\/ImageBoothInterface.png\" alt=\"The Editor GUI\" \/><\/p>\n<p>The currently available plugins are:<\/p>\n<h3>Tools<\/h3>\n<ol>\n<li>Paintbrush &#8211; paint the foreground color onto the selected layer<\/li>\n<li>Eraser &#8211; paint the background color onto the selected layer<\/li>\n<li>Clone &#8211; clone pixels relative to the clone source using the current brush<\/li>\n<li><img decoding=\"async\" src=\"http:\/\/patternweaver.com\/Graphics\/ImageBooth\/flood_fill.png\" alt=\"the image drowned in color\" \/>Paintbucket &#8211; flood fill a color into an image at a certain pixel with a given threshold and opacity<\/li>\n<li>Eyedropper &#8211; sample a color from the current layer<\/li>\n<\/ol>\n<h3>Operations<\/h3>\n<ol>\n<li><img decoding=\"async\" src=\"http:\/\/patternweaver.com\/Graphics\/ImageBooth\/negative.png\" alt=\"the image, inverse\" \/>Negative &#8211; invert the color values of the image<\/li>\n<li><img decoding=\"async\" src=\"http:\/\/patternweaver.com\/Graphics\/ImageBooth\/brightness_contrast.png\" alt=\"a shadowy lurker of an image\" \/>Brightness\/Contrast<\/li>\n<\/ol>\n<h3>Filters<\/h3>\n<ol>\n<li><img decoding=\"async\" src=\"http:\/\/patternweaver.com\/Graphics\/ImageBooth\/blur.png\" alt=\"the image, inverse\" \/>Gaussian Blur &#8211; Blur the image<\/li>\n<li>Sobel Edge Detector<\/li>\n<li><img decoding=\"async\" src=\"http:\/\/patternweaver.com\/Graphics\/ImageBooth\/laplacian.png\" alt=\"a shadowy lurker of an image\" \/>Laplacian Gradient Detector<\/li>\n<li><img decoding=\"async\" src=\"http:\/\/patternweaver.com\/Graphics\/ImageBooth\/sharpen.png\" alt=\"a shadowy lurker of an image\" \/>Sharpen<\/li>\n<li><img decoding=\"async\" src=\"http:\/\/patternweaver.com\/Graphics\/ImageBooth\/emboss.png\" alt=\"a shadowy lurker of an image\" \/>Emboss<\/li>\n<li><img decoding=\"async\" src=\"http:\/\/patternweaver.com\/Graphics\/ImageBooth\/high_pass.png\" alt=\"a shadowy lurker of an image\" \/>High Pass Filter<\/li>\n<\/ol>\n<h3>Brushes<\/h3>\n<ol>\n<li>1&#215;1<\/li>\n<li>3&#215;3 Round<\/li>\n<li>5&#215;5 Square<\/li>\n<li>5&#215;5 Round<\/li>\n<li>5&#215;5 Soft Round<\/li>\n<li>10&#215;10 Scattered<\/li>\n<li>10&#215;10 Soft Round<\/li>\n<\/ol>\n<p>So while it&#8217;s definitely got a lot of rough edges, it&#8217;s really becoming more practically useful all the time. That is, unless you use IE&#8230;<\/p>\n<p>So go to the <a href=\"http:\/\/imagebooth.patternweaver.com\/\">ImageBooth Beta<\/a>, grab an account, and play around with it.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>As I&#8217;ve been finishing features, I&#8217;ve just been updating what the new stuff is&#8230; but now that I have a working implementation of layers (though save isn&#8217;t yet linked to layers), I figure it&#8217;s time to stop and give an overall view of the ImageBooth Demo app and what it does. When you open it [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,6],"tags":[],"class_list":["post-134","post","type-post","status-publish","format-standard","hentry","category-datalus","category-js"],"_links":{"self":[{"href":"http:\/\/patternweaver.com\/blog\/wp-json\/wp\/v2\/posts\/134","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/patternweaver.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/patternweaver.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/patternweaver.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/patternweaver.com\/blog\/wp-json\/wp\/v2\/comments?post=134"}],"version-history":[{"count":0,"href":"http:\/\/patternweaver.com\/blog\/wp-json\/wp\/v2\/posts\/134\/revisions"}],"wp:attachment":[{"href":"http:\/\/patternweaver.com\/blog\/wp-json\/wp\/v2\/media?parent=134"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/patternweaver.com\/blog\/wp-json\/wp\/v2\/categories?post=134"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/patternweaver.com\/blog\/wp-json\/wp\/v2\/tags?post=134"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}