Giter Site home page Giter Site logo

jlertle / blob-util Goto Github PK

View Code? Open in Web Editor NEW

This project forked from nolanlawson/blob-util

0.0 2.0 0.0 31.18 MB

Cross-browser utils for working with binary Blobs

Home Page: http://nolanlawson.github.io/blob-util

License: Apache License 2.0

JavaScript 60.75% Shell 0.16% HTML 39.08%

blob-util's Introduction

blob-util

Build Status

blob-util is a Blob library for busy people.

It offers a tiny (~3KB min+gz) set of cross-browser utilities for translating Blobs to and from different formats:

  • <img/> tags
  • base 64 strings
  • binary strings
  • ArrayBuffers
  • data URLs
  • canvas

It's also a good pairing with the attachment API in PouchDB.

Note: this is a browser library. For Node.js, see Buffers.

Topics:

Install

Download it from the dist/ folder above, or use NPM:

$ npm install blob-util

or Bower:

$ bower install blob-util

Then stick it in your HTML:

<script src="blob-util.js"></script>

Now you have a window.blobUtil object. Or if you don't like globals, you can use Browserify.

Browser support

  • Firefox
  • Chrome
  • IE 10+
  • Safari 6+
  • iOS 6+
  • Android 4+
  • Any browser with either Blob or the older BlobBuilder; see caniuse for details.

Tutorial

Blobs (binary large objects) are the modern way of working with binary data in the browser. The browser support is very good.

Once you have a Blob, you can make it available offline by storing it in IndexedDB, PouchDB, LocalForage, or other in-browser databases. So it's the perfect format for working with offline images, sound, and video.

A File is also a Blob. So if you have an <input type="file"> in your page, you can let your users upload any file and then work with it as a Blob.

Example

Here's Kirby. He's a famous little Blob.

Kirby

So let's fulfill his destiny, and convert him to a real Blob object.

var img = document.getElementById('kirby');

blobUtil.imgSrcToBlob(img.src).then(function (blob) {
  // ladies and gents, we have a blob
}).catch(function (err) {
  // image failed to load
});

(Don't worry, this won't download the image twice, because browsers are smart.)

Now that we have a Blob, we can convert it to a URL and use that as the source for another <img/> tag:

var blobURL = blobUtil.createObjectURL(blob);

var newImg = document.createElement('img');
newImg.src = blobURL;

document.body.appendChild(newImg);

So now we have two Kirbys - one with a normal URL, and the other with a blob URL. You can try this out yourself in the blob-util playground. Super fun!

API

Warning: this API uses Promises, because it's not 2009 anymore.

###Overview

###createBlob(parts, options) Shim for new Blob() to support older browsers that use the deprecated BlobBuilder API.

Params

  • parts Array - content of the Blob
  • options Object - usually just {type: myContentType}

Returns: Blob

Example:

var myBlob = blobUtil.createBlob(['hello world'], {type: 'text/plain'});

###createObjectURL(blob) Shim for URL.createObjectURL() to support browsers that only have the prefixed webkitURL (e.g. Android <4.4).

Params

  • blob Blob

Returns: string - url

Example:

var myUrl = blobUtil.createObjectURL(blob);

###revokeObjectURL(url) Shim for URL.revokeObjectURL() to support browsers that only have the prefixed webkitURL (e.g. Android <4.4).

Params

  • url string

Example:

blobUtil.revokeObjectURL(myUrl);

###blobToBinaryString(blob) Convert a Blob to a binary string. Returns a Promise.

Params

  • blob Blob

Returns: Promise - Promise that resolves with the binary string

Example:

blobUtil.blobToBinaryString(blob).then(function (binaryString) {
  // success
}).catch(function (err) {
  // error
});

###base64StringToBlob(base64, type) Convert a base64-encoded string to a Blob. Returns a Promise.

Params

  • base64 string
  • type string | undefined - the content type (optional)

Returns: Promise - Promise that resolves with the Blob

Example:

blobUtil.base64StringToBlob(base64String).then(function (blob) {
  // success
}).catch(function (err) {
  // error
});

###binaryStringToBlob(binary, type) Convert a binary string to a Blob. Returns a Promise.

Params

  • binary string
  • type string | undefined - the content type (optional)

Returns: Promise - Promise that resolves with the Blob

Example:

blobUtil.binaryStringToBlob(binaryString).then(function (blob) {
  // success
}).catch(function (err) {
  // error
});

###blobToBase64String(blob) Convert a Blob to a binary string. Returns a Promise.

Params

  • blob Blob

Returns: Promise - Promise that resolves with the binary string

Example:

blobUtil.blobToBase64String(blob).then(function (base64String) {
  // success
}).catch(function (err) {
  // error
});

###dataURLToBlob(dataURL) Convert a data URL string (e.g. 'data:image/png;base64,iVBORw0KG...') to a Blob. Returns a Promise.

Params

  • dataURL string

Returns: Promise - Promise that resolves with the Blob

Example:

blobUtil.dataURLToBlob(dataURL).then(function (blob) {
  // success
}).catch(function (err) {
  // error
});

###imgSrcToDataURL(src, type, crossOrigin) Convert an image's src URL to a data URL by loading the image and painting it to a canvas. Returns a Promise.

Note: this will coerce the image to the desired content type, and it will only paint the first frame of an animated GIF.

Params

  • src string
  • type string | undefined - the content type (optional, defaults to 'image/png')
  • crossOrigin string | undefined - for CORS-enabled images, set this to 'Anonymous' to avoid "tainted canvas" errors

Returns: Promise - Promise that resolves with the data URL string

Examples:

blobUtil.imgSrcToDataURL('http://mysite.com/img.png').then(function (dataURL) {
  // success
}).catch(function (err) {
  // error
});
blobUtil.imgSrcToDataURL('http://some-other-site.com/img.jpg', 'image/jpeg', 
                         {crossOrigin: 'Anonymous'}).then(function (dataURL) {
  // success
}).catch(function (err) {
  // error
});

###canvasToBlob(canvas, type) Convert a canvas to a Blob. Returns a Promise.

Params

  • canvas string
  • type string | undefined - the content type (optional, defaults to 'image/png')

Returns: Promise - Promise that resolves with the Blob

Examples:

blobUtil.canvasToBlob(canvas).then(function (blob) {
  // success
}).catch(function (err) {
  // error
});

Most browsers support converting a canvas to both 'image/png' and 'image/jpeg'. You may also want to try 'image/webp', which will work in some browsers like Chrome (and in other browsers, will just fall back to 'image/png'):

blobUtil.canvasToBlob(canvas, 'image/webp').then(function (blob) {
  // success
}).catch(function (err) {
  // error
});

###imgSrcToBlob(src, type, crossOrigin) Convert an image's src URL to a Blob by loading the image and painting it to a canvas. Returns a Promise.

Note: this will coerce the image to the desired content type, and it will only paint the first frame of an animated GIF.

Params

  • src string
  • type string | undefined - the content type (optional, defaults to 'image/png')
  • crossOrigin string | undefined - for CORS-enabled images, set this to 'Anonymous' to avoid "tainted canvas" errors

Returns: Promise - Promise that resolves with the Blob

Examples:

blobUtil.imgSrcToBlob('http://mysite.com/img.png').then(function (blob) {
  // success
}).catch(function (err) {
  // error
});
blobUtil.imgSrcToBlob('http://some-other-site.com/img.jpg', 'image/jpeg', 
                         {crossOrigin: 'Anonymous'}).then(function (blob) {
  // success
}).catch(function (err) {
  // error
});

###arrayBufferToBlob(buffer, type) Convert an ArrayBuffer to a Blob. Returns a Promise.

Params

  • buffer ArrayBuffer
  • type string | undefined - the content type (optional)

Returns: Promise - Promise that resolves with the Blob

Example:

blobUtil.arrayBufferToBlob(arrayBuff, 'audio/mpeg').then(function (blob) {
  // success
}).catch(function (err) {
  // error
});

###blobToArrayBuffer(blob) Convert a Blob to an ArrayBuffer. Returns a Promise.

Params

  • blob Blob

Returns: Promise - Promise that resolves with the ArrayBuffer

Example:

blobUtil.blobToArrayBuffer(blob).then(function (arrayBuff) {
  // success
}).catch(function (err) {
  // error
});

Credits

Thanks to webmodules/blob for the Blob constructor shim, and to the rest of the PouchDB team for figuring most of this crazy stuff out.

Building the library

npm install
npm run build

To generate documentation in doc/:

npm run jsdoc

or in markdown format as api.md

npm run jsdoc2md

The playground is just jsdoc with some extra text containing Kirby and the code samples and such.

So unfortunately you will need to do a manual diff to get the docs up to date. You'll need to diff:

  • api.md to README.md
  • index.html to doc/global.html

Update: I also manually added a bunch of code samples to README.md because jsdoc didn't seem to support that. So... yeah, jsdoc might not be so helpful anymore.

Testing the library

In the browser

Run npm run dev and then point your favorite browser to http://127.0.0.1:8001/test/index.html.

The query param ?grep=mysearch will search for tests matching mysearch.

Automated browser tests

You can run e.g.

CLIENT=selenium:firefox npm test
CLIENT=selenium:phantomjs npm test

This will run the tests automatically and the process will exit with a 0 or a 1 when it's done. Firefox uses IndexedDB, and PhantomJS uses WebSQL.

blob-util's People

Contributors

nolanlawson avatar

Watchers

Jason Lee Ertle avatar  avatar

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.