Giter Club home page Giter Club logo

camanjs's Introduction

About the Project

This project is no longer actively maintained. Thanks everyone for the support and interest over the years!

The main focus of CamanJS is manipulating images using the HTML5 canvas and Javascript. It's a combination of a simple-to-use interface with advanced and efficient image/canvas editing techniques. It is also completely library independent and can be safely used next to jQuery, YUI, Scriptaculous, MooTools, etc.

CamanJS is very easy to extend with new filters and plugins, and it comes with a wide array of image editing functionality, which is only growing as the community makes more plugins. All features that are not a part of the core CamanJS library are in a separate plugins repository.

For more information, I highly recommend taking a look at the official website where there is more comprehensive documentation and interactive demos. You can also read the wiki for some basic information about the project and how to use it.

CamanJS is written in Coffeescript as of version 3.0. It works both in-browser and in NodeJS.

CamanJS is a project that I work on in purely my own spare time. If you would like to pitch in a beer or donate to say thanks, my Bitcoin address is: 1EVNQ7FiWDaqpfYXRLCtgMe5RBcz3kEuAG

Usage

Include one of the versions in the dist/ folder, then you can run:

Caman("#image-id", function () {
  this.brightness(10);
  this.contrast(20);
  this.render(function () {
    alert("Done!");
  });
});

Caman also supports modifying images via the data-caman HTML attribute. Simply separate each instruction with a space. Images with the data-caman attribute will automatically be modified at page load.

<img data-caman="saturation(-10) brightness(20) vignette('10%')" src="path/to/image.jpg">

HiDPI Support

Version 4 introduces better support for HiDPI (Retina) displays. It allows you to specify a higher resolution replacement using HTML data attributes. Keep in mind, however, that higher resolution images take longer to render.

HTML data attributes

  • data-caman-hidpi: URL to the high resolution replacement image
  • data-caman-hidpi-disabled: HiDPI support is enabled by default, so add this attribute if you wish to force disable it

Upgrading to Version 4

There is only 1 breaking change that occured with the version 4 release. When you initialize CamanJS with a canvas and an image, the parameter order has changed. It is now:

Caman("#canvas-id", "/path/to/image.png", function() {});

This is in order to be more consistent with initialization, such that the "initialization object" is always the first parameter. Update your code accordingly.

Development

If you are a developer who is contributing directly to the project, there are some tools to help you out.

Building

To install all dependencies required for development, run npm install -d.

Because all plugins are in a separate repository, make sure you run:

git submodule init && git submodule update

To build, simply run cake build. The resulting files will be placed in the dist/ folder. Plugins will be automatically discovered and added to caman.full.js after the core library. You can also auto-compile when a file changes by using cake watch.

If you add any files to the core library, you will need to add them to the coffeeFiles array in the Cakefile. The point of this is so that order is preserved when generating the file JS file. Plugins do not need to be added to the Cakefile.

You will probably want to generate documentation if you make any changes. In addition to the normal requirements, you will also need the Python library Pygments.

To generate the documentation, run cake docs.

CDN JS Hosting

CamanJS is hosted on CDN JS if you're looking for a CDN hosting solution. It is the full and minified version of the library, which means all plugins are included. Simply load CamanJS directly from this URL for usage on your site.

NodeJS Compatibility

CamanJS is fully compatible with NodeJS. The easiest way to install it is:

npm install caman

Saving from NodeJS

To save your modified image in NodeJS, simply call the save() function after rendering is finished by passing a callback function to render(). Trying to save before rendering is finished will cause issues.

Caman = require('caman').Caman;

Caman("./path/to/file.jpg", function () {
  this.brightness(40);
  this.render(function () {
    this.save("./output.png");
  });
});

Testing

Tests for CamanJS run both in NodeJS and the browser.

NodeJS

The NodeJS tests use mocha as the test runner. The simplest way to run the test suite is by running npm test.

Browser

The browser tests are run by Karma. It will start up Chrome, Firefox, and Safari (if running OSX) in the background. You can minimize each of these browsers if desired. It will automatically run tests after CamanJS is recompiled by the Cakefile as well.

You can run Karma by running karma start, or you can do a single run with the NodeJS tests by running npm test.

camanjs's People

Contributors

anthonysutardja avatar bebraw avatar cezarsa avatar dustinhigginbotham avatar lukaszfiszer avatar meltingice avatar mgallego avatar mihelich avatar patrickjs avatar robertlong avatar rwaldron avatar sandbochs avatar sigbjornf avatar yannickcr avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

camanjs's Issues

Opera 11 and IE9

In Opera 11(I've got 11.64) most of effects (also on camanjs.com -> examples -> preset examples) didn't work. For example "Glowng Sun" effect draw a circle around the center or fill all scene black. It does randomly.

Rendering in IE9 is very sloooow. Also benchmark test on camanjs.com gives big values.

screenshot: http://imageshack.us/photo/my-images/220/screentf.jpg/

Is there any fix for those issues?

Apple Retina Display Issues

When modifying the canvas element after applying a Caman filter, text and other added elements are blurry in Chrome on a Retina Display.

Submitting a pull request to fix this issue.

Value option for Curves plugin

We discussed this briefly at #36 already. It appears "value" curve adjusts the overall contribution of color channels. Effectively this allows you to increase or decrease the value of all color channels at a same time making it handy for some quick color level adjustments. Mathematically speaking it would adjust (multiply) current color using given multiplier relative to normal.

I think the API for this could be quite simple. Probably having just something like this would work:

this.curves('v', [0, 0], [100, 120], [180, 240], [255, 255]);

Do you this sort of addition would be ok?

Node version runs out of memory with big images

I am trying to perform various operations on a reasonably big image (5616 x 3744 px) using Node version of Caman. Unfortunately it seems to run out of memory (gives "FATAL ERROR: JS Allocation failed - process out of memory" error) and gets stuck around finishInit (at this.originalPixelData.push(pixel); loop).

Considering this.originalPixelData is used only by revert perhaps you could add some kind of an option either to disable it temporarily or make revert optional (saves memory by default!). Either way would work.

Ability to reduce the amount of colours used in an image

Say I'm working with an image which has 2 million colours, however it is for a destination that only supports 6 or 8 or 10 or whatever. It would be nice if there was the ability to be able to reduce the canvas to only have the set amount of colours.

This seems similar to the way the current "clip" filter works, however unlike clip where colours will turn white if they are not popular enough, instead with this, the colours will be merged into the remaining colours. E.g. pink, magento will be replaced by the more generic red if the only colours that are allowed are red, green and yellow.

Thoughts?

Cant use this.filter

Hi,

i want use that code:

Caman("#" + sId + " canvas", function ( )
{
    this.filter.sharpen(15);

    this.render(
    );
}); 

But it get "this.filter is undefined".

How can i get access to the sharpen filter?

// Oliver

First Caman instance won't render

Consider the test code below:

<body>
  <h1>CamanJS Testing Playground</h1>
  <p>Note: this cannot be accessed locally via the file:// protocol thanks to same-domain origin policy. It must be placed behind a webserver.</p>
..
  <table>
    <tr>
     <td>
       <img id="curve_test" alt="curve test image" src="../images/test1_600.jpg" />
     </td>
     <td>
       <img id="value_test" alt="value test image" src="../images/test1_600.jpg" />
     </td>
   </tr>
  </table>

  <script type="text/javascript">
  Caman.DEBUG = true;

  var curve_test = Caman('#curve_test', function () {
      this.curves('rgb', [0, 0], [100, 30], [180, 240], [255, 255]);

      this.curves('r', [0, 0], [40, 200], [255, 255]);

      this.render();

      console.log('first done');
  }); 

  var value_test = Caman('#value_test', function() {
      this.curves('r', [0, 0], [40, 200], [255, 255]);

      this.render();

      console.log('second done');
  }); 
  console.log(curve_test, value_test);
  </script>
</body>

For some reason it outputs this:

CamanInstance
analyze: Analyze
id: 0
__proto__: CamanInstance

CamanInstance
analyze: Analyze
canvas: HTMLCanvasElement
canvasID: "#value_test"
context: CanvasRenderingContext2D
dimensions: Object
finishedFn: function () {
id: 1
image: HTMLImageElement
imageData: ImageData
options: Object
pixelData: Uint8ClampedArray[962400]
__proto__: CamanInstance
 curves.html:46

second done curves.html:44
BLOCK #0 - Filter: curves, Start: 0, End: 240600 caman.full.js:1309
Block #0 finished! Filter: curves caman.full.js:1309
BLOCK #1 - Filter: curves, Start: 240600, End: 481200 caman.full.js:1309
Block #1 finished! Filter: curves caman.full.js:1309
BLOCK #2 - Filter: curves, Start: 481200, End: 721800 caman.full.js:1309
Block #2 finished! Filter: curves caman.full.js:1309
BLOCK #3 - Filter: curves, Start: 721800, End: 962400 caman.full.js:1309
Block #3 finished! Filter: curves caman.full.js:1309
Filter curves finished! 

As you can see, the first CamanInstance is borked somehow and doesn't render. The latter render shows up just fine. Any idea what might cause this?

Note that I'm using the trunk version with my curve parameter addition at the moment. I gave it a go using invert filter with the same results (rules out an issue with my patch).

Accept pure DOM object instead of id as the second parameter

I ran into this need while developing a little application. I have a reference to a DOM Canvas and I actually have to inject an artificial id for it in order to make it work with Caman. This is sort of nasty.

Do you think it would be acceptable if Caman object accepted DOM object as its second parameter in addition to ids?

Using the same class/id name more than once when creating CamanInstance

I've been working with sandbochs and we're coming across an unexpected behavior.

Looking at the code, it seems that the behavior comes from an intentional design decision.

We are writing simple photo filter site and are interested in keeping as seamless a customer experience as possible. To do so, we are keeping a clone of the DOM element that we are converting to a Caman canvas on hand. The idea is to swap it out for the current canvas instead of reverting the image if the user has decided to apply a different filter.

When we swap the element in, we're giving it the same class and id properties as the previous element that was converted to a canvas in order to make the system infinitely repeatable. The behavior that we are encountering is that once we've written a line to replace an image with a Caman canvas, we can never use the same identifier, whether it be the class or id, again.

Looking at the Caman code, it appears that the previous identifiers are being stored and if a CamanInstance has already been created using that identifier, that CamanInstance is returned instead of one created from the new DOM element with the same identifiers. This seems like it is a performance optimization, but it has led to us creating a work around to never use the same identifier twice. However, when we comment out caman.coffee line 36:

    when 2
      return Store.execute arguments[0], arguments[1] if Store.has arguments[0]

it behaves as we had expected, allowing us to re-use the same identifiers for the replacement DOM element.

We're adding this issue because we were hoping to either better understand the advantage that this store provides or to find out if commenting this line out will cause us additional issues.

Use caman for embroidery previews?

Not sure if caman is the right project for this, but it sure would be nice to be able to have the ability for embroidery preview.

Interactive example is here: http://www.vistaprint.com.au/vp/ns/easypath/studio.aspx?pf_id=AFD&combo_id=457407&combo=276980.142.1.244654%7c244654%7c137%7c0&uei=359859&ag=true&ssc=1&filter=9%3a10013%7c%7c1%2c59%3a10230%7c%7c1%2c3%3a10232%7c%7c1&xnav=previews&xnid=button&rd=2&ref=1&referer=http%3a%2f%2fwww.vistaprint.com.au%2fgallery.aspx%3fpg%3d112%26xnav%3dTsrItem%26xnav%3dTsrButton_01

So we can have an image or some text drawn with canvas, then utilise caman or whatever project to apply an embroidery filter to the image.

Is caman the right project for this? If so, how would we go about making that happen? Otherwise, any idea where else I should be looking?

Script Error IE9

I'm using IE9 in cooperation with Caman.js

My script is the following.
It works perfectly in every browser except for IE9.
IE is throwing the following error in it's console:

"SCRIPT5022: DOM Exception: INDEX_SIZE_ERR (1)"

It's not just with this script but with every time I try to use Caman.js in IE9
Not working at all.

[code]
function imgDeSat(){
//alert("INIT");
jQuery(window).load(function(){

                             //alert("DESAT");

    /*DEFINTIONS*/
    var speed = 500;
    var saturationVar = -50;
    /**/

    jQuery('.slideshow-item img').each(function(index){

        jQuery(this).clone().prependTo(jQuery(this).css({'position':'absolute','top':'0px','left':'0px'}).parent()).addClass('img-desaturate').attr('id', 'canvasID');

        var target = '.item-'+(index+1);
        var target_img = '.item-'+(index+1)+' img.img-desaturate';   /*<<<<<<<<<<<<<<<<*/

        Caman(target_img).saturation(saturationVar).render();


        jQuery(target).find('#canvasID').css({'position':'absolute','z-index':'99'}).addClass('img-desaturate');

    });

    jQuery('.slideshow-set').mouseover(function(){  
        jQuery(this).find('canvas').stop().animate({opacity:0}, speed);     
    });
    jQuery('.slideshow-set').mouseout(function(){   
        jQuery(this).find('canvas').stop().animate({opacity:1}, speed); 
    });

});

}
[/code]

Regards,
Valentin

Investigate speed improvements for convolution

Currently, processing an image via convolution matrices is the slowest part of CamanJS by far. One thing to investigate is whether converting the convolution matrices to 1D arrays will improve speed at all.

Calling filters on returned instance fails

Hi!

I'm building an instargam-like webapp that allows you to upload filtered images to a server.

I'm having an issue with returned instance of caman

Using it like this:

    this.caman = Caman(this.canvas, function() {
        this.sepia(40).saturation(5).render();
    });

works OK. However this:

    this.caman = Caman(this.canvas);
    this.caman.sepia(140).render();

fails with this error: http://imm.io/LXPy

TypeError: this.c.pixelData is undefined
n = this.c.pixelData.length;

.revert() fails if instantiated with canvas obj

Everything works like a charm up to the point where I try to get original image back to the canvas. It looks like when you instantiate your Caman object like this:

    this.ctx.drawImage(opt.image, opt.cx, opt.cx, 640, 640, 0, 0, 640, 640);
    this.active && (delete this.caman);
    this.deactivate();
    this.caman = Caman(this.canvas, function() {
        that.activate();
    });

and then somewhere you do this:

        if (!that.active) return;

        type = this.getAttribute('data-filter');

        if (typeof that.filters[type] === 'function') {
            that.deactivate();
            that.caman.revert(applyFilter);
        }

you get this error:

TypeError: this.options is undefined
return this.loadCanvas(this.options.image, this.canvas, ready);

If I switch to cropping via Caman, will it be OK? Or should I just repaint canvas myself?

using <img> instead of script and canvas?

I love the idea of camanjs, but the fact that it requires a script and canvas element seems too developer-oriented, rather than every day user oriented. I would like to suggest using the img element and having caman.js auto-convert them to canvas elements with the relevant operations appied, with the instructions encoded in a data-* attribute, such as

<img src="myimage.jpg" data-caman-instructions="saturation(20) gamma(1.4) vintage contrast(5) exposure(15) vignette(300,60)">

or something similar along these lines, which caman then replaced on page with a canvas element that generates an overlay Image() object based on the canvas's .toDataURL so that "save as" still works.

This way, the usability becomes infinitely better: include camanjs, and just use image tags. Operations or canvas element not supported in a browser? Not a problem, the image element will simply show the original image, instead of being converted to a canvas element.

Occasionally the image will fail to load when invoked

Sometimes when invoking CamanJS on an image element, the image will fail to load and it will not be painted to the canvas. The error given is:

Uncaught Error: INDEX_SIZE_ERR: DOM Exception 1

I have a hunch its some kind of race condition/timing issue with the loader function, although I haven't been able to pinpoint it yet.

NodeJS save but no effect

Hi, I'm testing the CamanJS and I have a little issue. Using the nodejs, the pictures are saved, but none effect was applied.

My nodejs code:

var sys   = require('util'),
    caman = require('/usr/lib/node_modules/caman/dist/caman.full.js');

sys.puts("started...");
var image = caman.Caman('/opt/node/001.jpg', function() {
    this.sunrise();
    this.render();
    this.save('/opt/node/001_save.png');
});

My script is wrong or something is not working.

Thanks in advance.

Rendering multiple images gives garbled output

When I apply a complicated filter to more than one image, I get incorrect results. It looks like CamanJS is getting the dimensions of the images mixed up, causing problems with (at least) the vignette filter.

If I chain all the callbacks so that images render sequentially, I get correct results - but it's awkward. Any idea what's going on?

<!DOCTYPE html>
<html lang="en">
<head>
  <title>Simultaneous rendering</title>
  <script type="text/javascript" src="../../dist/caman.full.js"></script>
  <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>

  <script type="text/javascript">
Caman.DEBUG = true;
var ids = ["#img0", "#img1"];
for (var i in ids) {
    Caman(ids[i], function() {
        this.lomo().render();
    });
}
  </script>
</head>
<body>
  <img id="img0" alt="test image" src="../images/test1_600.jpg" />
  <img id="img1" alt="test image" src="../images/test1_1280.jpg" />
</body>
</html>

The rendered output then looks like:

600x401 with Lomo

1280x856 with Lomo

Example for listen events?

Trying to figure out how to listen for the processStart event. I understand the callback on render(), but not sure where or how listen() should be called. I'm still a bit new at Javascript and the src appears to require target, type ( I assume 'processStart' ) and fn. What's the target?

Apple Retina Display Issues

When editing the canvas after rendering with CamanJS, any added text or images are blurry in Chrome.

The canvas element needs to be scaled up 2x and then scaled down with CSS.

Submitting a pull request that fixes this bug.

Chaining curves with different lengths gives TypeError

Try following:

Caman("#image", function () {
    this.curves('rgb', [0, 0], [100, 120], [180, 240], [255, 255]);

    // Specifying individual color channels
    this.curves(['r', 'b'], [0, 0], [180, 240], [255, 255]);

    this.render();
});

Note the uneven length of the curves. This seems to result in "Uncaught TypeError: Cannot read property '0' of undefined ".

Is there some nice way to adjust "value" of the colors using a curve?

Layering with PNGs containing transparency

Not sure if this is a bug or just an enhancement, but it would be nice to be able to use pngs that contain transparency with the layering system. My tests show that when using "overlayImage" with pngs the transparency in the png goes black. If there is already a workaround for this I would be glad to know it. Thanks!

crop and resize

It would be nice if CamanJS would provide crop and resize functionalities, nothing fancy just a wrapper around canvas drawImage.

bug: replaceCanvas runs into an endless recursion

I tested this with the replace and crop plugins:

this.resize({
   width: 200,
   height: 200
}).render();

or

this.crop(200, 200, 20, 20).render();

In both situations, the plugin is called over and over again, finally throwing a "too much recursion" error in firefox. I suppose this has to do with the fact that the command "this.replaceCanvas(canvas);" in the plugin code somehow manages to invoke the plugin again (maybe because it is still in the render queue?), leading to an endless recursion.
I have the same problem with a nice "halftone screen" plugin that I am currently developping.

After resize new canvas is without id

Resize function creates new canvas element. But this new canvas doesn't have the old canvas id. It means that after calling:

Caman('#picture', function () {
    this.resize({
       width: 1024,
    height: 768
    });
    this.render();
});

I'm not able to use '#picture' id anymore

Re-initialise Caman at run time?

I am using Caman in a web application and I am trying to achieve a sort of undo/redo functionality.

I am able to re-draw the image on the canvas and go back and forth with all the steps, but it looks like the Caman object needs to be re-inizialised to get the image currently on the canvas.

How can I do that?

Mixing multiple images

Hi this is a great project!

I notice that you had an image blender. It would be great if instead of proving a single Parent, you could provide an array of them. This would be much faster than the current solution of running the blender multiple times (or at least it seems like it would be). Perhaps this is already possible if so please let me know how.

This would be useful to merge B&W images into RGB pictures for instance.

Thanks,

Ghislain

Access to Progress Information

Hi,

I need to crunch some pretty big images using Caman (think 5MP+). As this can take a while it would be nice to be able to provide some kind of progress information to the user. Currently I have a generic progress thinger (one of those animations) in place which I show while it's processing.

It would be nice if there was a way to provide more accurate information. I noticed you have a block renderer in place. Do you think it would make sense to expose some info related to it via some API? Basically I would like to have a callback that's triggered as a block has been finished. I guess it would be nice to pass the amount of currently finished blocks and the amount of total blocks to it. Those would get me started I think.

If you think this is something that should be added to Caman, I don't mind looking into it as far as we can agree on the API. Still got that curve thinger (#43) to finish (spent last week on vacation). :)

Proxy in CakePHP

Hi, I am experimenting with CamanJs in CakePHP. I wanted to use the proxy function which did not work in the beginning. The problem is the hardwired "url" variable, which breaks the CakePHP routing.

// We have a remote proxy setup properly, so lets alter the image src
return Caman.remoteProxy + "?url=" + encodeURIComponent(src);

Perhaps you can change this in a future release to

// We have a remote proxy setup properly, so lets alter the image src
return Caman.remoteProxy + "?camanjsSpecialUniquePhotourl=" + encodeURIComponent(src);

or something...

Canvas loses style information

Hi,

I noticed that CamanJS loses style information attached to a Canvas in the recent release (3.2.2). Basically I've set up a hidden canvas (display: none) which I would like to remain hidden. I worked around this by wrapping the canvas in a div that contains the property.

It used to work without this specific hack in 3.0 so looks like a regression to me.

I haven't tried out the trunk version yet so it's possible the issue has been fixed already.

Modifying a pre-existing canvas

//1 of 2
Caman('../images/banner.png', '#separate', function () {
    this.colorize(25, 180, 200, 40);
    this.render();
});
//2 of 2
Caman('#separate', function() {
    this.invert();
    this.render();
});
//1 of 1
Caman('../images/banner.png', '#all', function () {
    this.colorize(25, 180, 200, 40);
    this.invert();
    this.render();
});

see: http://earthiverse.ath.cx/tests/camanjs.html

The separate one won't complete the 2nd part Caman('#separate', function() {... when I am expecting it to.

Under 'Loading onto a Canvas without an Image' on http://camanjs.com/docs, I think I followed the right procedure for this.

I would like to modify a pre-existing canvas on a different page, so this would be useful to me.

Revert is broken

Seems to be a regression in 3.2 where using the revert function sometimes fails

camanjs.com site really should use caman.js ;)

right now it has two images, with the modified image simply a hardcoded bitmap. That should really use the caman.js library on top of the original so that people can see what's going on "for reals". A view-source or inspect element doesn't teach people anything right now (other than, "wait, it's not actually using caman" =)

Run Camanjs on a new Image() or image data

I'm working on an app where i capture the image from my webcam with WebRTC. But it looks like, just from code analysis, that it doesn't support working on a new Image() or image data, is that correct? If so it would be nice to have that, if not how would that work?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.