# aalib.js **Repository Path**: smith/aalib.js ## Basic Information - **Project Name**: aalib.js - **Description**: No description available - **Primary Language**: JavaScript - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2019-03-23 - **Last Updated**: 2020-12-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # aalib.js This library converts images and movies to [ASCII art](https://en.wikipedia.org/wiki/ASCII_art). It is written entirely in JavaScript and is intended to use in web browsers. ## Examples * [Mona](http://mir3z.github.io/aalib.js/examples/mona.html) ([original](http://mir3z.github.io/aalib.js/resources/mona.png)) * [Lenna](http://mir3z.github.io/aalib.js/examples/lenna.html) ([original](http://mir3z.github.io/aalib.js/resources/lenna.png)) * [Marylin](http://mir3z.github.io/aalib.js/examples/marylin.html) ([original](http://mir3z.github.io/aalib.js/resources/marylin.jpg)) * [Evangeline](http://mir3z.github.io/aalib.js/examples/evangeline.html) ([original](http://mir3z.github.io/aalib.js/resources/evangeline.jpg)) * [Monica](http://mir3z.github.io/aalib.js/examples/monica.html) ([original](http://mir3z.github.io/aalib.js/resources/monica.jpg)) * [Big Buck Bunny](http://mir3z.github.io/aalib.js/examples/bbb.html) ## Interactive demo [Click here](http://mir3z.github.io/aalib.js/playground/www/) ## Usage Converting to ASCII art is performed by reading an image (or a video) then processing it by a series of processors and finally rendering the output. In general it has the following form: `Reader` >> `Pre-Filter` >> `AA` >> `Post-Filter` >> `Renderer` This means what follows: 1. `Reader` reads image (static or moving) and converts it to internal representation. 2. (Optional) `Pre-Filter` (e.g. brightness or contrast) can be applied to the image from the 1st step. 3. `AA` transforms image from the 2nd step to ASCII art. 4. (Optional) Another `Post-Filter` can be applied but in this step it is applied to ASCII art image. 5. `Renderer` renders image from the 4th step to a given output. That is how it looks expressed in a code: ```javascript aalib.read.image.fromURL("marylin.jpg") .map(aalib.filter.contrast(0.9)) .map(aalib.aa({ width: 530, height: 160 })) .map(aalib.filter.brightness(10)) .map(aalib.render.html({ el: document.querySelector(".aa-image") })) .subscribe(); ``` See [API](#api) section for more details on how the processors work. The library is using [RxJS](https://github.com/Reactive-Extensions/RxJS) under the hood. Every reader actually returns an [Observable](http://reactivex.io/documentation/observable.html) so processing is not started until `subscribe` method is called. Data emitted by observables may be transformed by [map](http://reactivex.io/documentation/operators/map.html) operator, or you are allowed to perform any operation (like logging or side-effects) by using [do](http://reactivex.io/documentation/operators/do.html) operator. The library is distributed as: * a standalone UMD library (see `dist` directory) - exposed as a global `aalib` namespace. Dedicated for use in browsers. ``` ``` * ES6 modules (see `lib` directory) - for node.js ``` const aalib = require("aalib.js"); // or import aalib from "aalib.js"; ``` You may also want to load separate files by importing/requiring directly from `aalib.js/lib`: ## API ### Readers These are objects which read from various sources and write to a processing stream. #### ImageReader Exposed in `aalib.read.image` and as a default export in `aalib.js/lib/readers/ImageReader`. Factory methods: * fromURL(url:string) - creates `ImageReader` reading from given URL and returns observable. * fromHTMLImage(img:HTMLImageElement) - creates `ImageReader` reading given `HTMLImageElement` and returns observable. #### VideoReader Exposed in `aalib.read.video` and as a default export in `aalib.js/lib/readers/VideoReader`. Factory methods: * fromVideoElement(video:HTMLVideoElement, options:object) - creates `VideoReader` reading from given `HTMLVideoElement` and returns observable. `options` accepts the following options: * `autoplay:boolean` - If `true`, starts playing video automatically, default: `false` #### ImageDataReader Exposed as `aalib.read.imageData` or as a default export in `aalib.js/lib/readers/ImageDataReader`. Use the `fromImageData` factory method to create observable from an image data object. An image data object contains three mandatory fields; `width`, `height`, and `data`. The first two describe the dimensions of the image data, while the third is an array of _width * height * 4_ elements, where each pixels is represented as r, g, b, alpha. ImageData object are returned for example when getting pixel data from a canvas, or when rendering to an offscreen buffer using WebGL. ### Filters Filters are processors changing each component of an image. When a filter is applied to a regular image it changes a RGB value. When a filter is applied to ASCII art image it changes the only component the image has - intensity. Intensity is a value which tells whether part of an image should be rendered as a "dark" or "light" character. #### inverse Exposed as `aalib.filter.inverse` or as a default export in `aalib.js/lib/filters/inverse`. aalib.filter.inverse() This filter inverses each component of an image. By inversion I mean the function: `f(x) = 255 - x` #### linear Exposed as `aalib.filter.linear` or as a default export in `aalib.js/lib/filters/linear`. aalib.filter.linear(a:number, b:number) It applies the linear transformation: `f(x) = ax + b` #### brightness Exposed as `aalib.filter.brightness` or as a default export in `aalib.js/lib/filters/brightness`. aalib.filter.brightness(value:number) It changes the brightness of an image. This is the special case of the linear filter where `a = 1`. #### contrast Exposed as `aalib.filter.contrast` or as a default export in `aalib.js/lib/filters/contrast`. aalib.filter.contrast(value:number) It changes the contrast of an image. This is the special case of the linear filter where `b = 0`. #### desaturate Exposed as `aalib.filter.desaturate` or as a default export in `aalib.js/lib/filters/desaturate`. aalib.filter.desaturate() It desaturates (converts to a grayscale) an image. ### AA This processor handles actual conversion to ASCII art image. Exposed as `aalib.aa` or as a default export in `lib/aa`. aalib.aa(options:object) It accepts the following options: * `width:number` - width (in characters) of target ASCII art image. * `height:number` - height (in characters) of target ASCII art image. * `colored:boolean` - if `true`, the colors of the original image are preserved. Every character in a target image has a mean color of area it represents in the original image. ### Renderers Renderers outputs ASCII art image. They can render using different characters set. By default two charsets are defined are defined: * `ASCII_CHARSET` - printable ASCII characters - range: <32, 127>. This is the default one. * `SIMPLE_CHARSET` - characters from list `['.', ':', '*', 'I', '$', 'V', 'F', 'N', 'M']`. They are exposed in each renderer as named export: `import { ASCII_CHARSET, SIMPLE_CHARSET } from "lib/renderers/HTMLRenderer";` or as `aalib.charset` #### HTMLRenderer Exposed as `aalib.render.html` or as a default export in `aalib.js/lib/renderers/HTMLRenderer`. aalib.render.html(options:object) Renders ASCII art image as HTML element. Options: * `tagName:string` - tag name of the rendered HTML element, default: `pre`. * `el:HTMLElement` - if defined, use this element as render target. Otherwise create a new element defined by `tagName`. * `fontFamily:string` - font being used while rendering, default: `monospace`. * `fontSize:number` - font size of the rendered text, default: `7px`. * `charset:string[]` - a list of characters being used while rendering, default: printable ASCII characters (range <32, 127>). * `background:string` - background color of target HTML element, default `#FFF`. * `color:string` - color of the text. Ignored if output image is not monochrome (see `colored` in AA options), default: `#000`. #### CanvasRenderer Exposed as `aalib.render.canvas` or as a default export in `aalib.js/lib/renderers/CanvasRenderer`. aalib.render.canvas(options:object) Renders ASCII art image as Canvas element. Options: * `fontSize:number` - font size of the rendered text, default: `7px`. * `fontFamily:string` - font being used while rendering, default: `monospace`. * `lineHeight:number` - defines line height, default: 7px. * `charWidth:number` - defines the width of the characters, default: 4.2px. * `width:number` - defines canvas width in pixels, default: 400. * `height:number` - defines canvas height in pixels, default: 300. * `el:HTMLElement` - if defined, use this element as render target. Otherwise create a new canvas. * `charset:string[]` - a list of characters being used while rendering, default: printable ASCII characters (range <32, 127>). * `background:string` - background color of canvas, default `#FFF`. * `color:string` - color of the text. Ignored if output image is not monochrome (see `colored` in AA options), default: `#000`. ## License The MIT License (MIT). Copyright (c) 2017 mirz (that.mirz@gmail.com)