canvas-blob.js 2.79 KB
/*
 * JavaScript Canvas to Blob 2.0.5
 * https://github.com/blueimp/JavaScript-Canvas-to-Blob
 *
 * Copyright 2012, Sebastian Tschan
 * https://blueimp.net
 *
 * Licensed under the MIT license:
 * http://www.opensource.org/licenses/MIT
 *
 * Based on stackoverflow user Stoive's code snippet:
 * http://stackoverflow.com/q/4998908
 */

/*jslint nomen: true, regexp: true */
/*global window, atob, Blob, ArrayBuffer, Uint8Array, define */

(function (window) {
	'use strict';
	var CanvasPrototype = window.HTMLCanvasElement &&
			window.HTMLCanvasElement.prototype,
		hasBlobConstructor = window.Blob && (function () {
			try {
				return Boolean(new Blob());
			} catch (e) {
				return false;
			}
		}()),
		hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array &&
			(function () {
				try {
					return new Blob([new Uint8Array(100)]).size === 100;
				} catch (e) {
					return false;
				}
			}()),
		BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder ||
			window.MozBlobBuilder || window.MSBlobBuilder,
		dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob &&
			window.ArrayBuffer && window.Uint8Array && function (dataURI) {
			var byteString,
				arrayBuffer,
				intArray,
				i,
				mimeString,
				bb;
			if (dataURI.split(',')[0].indexOf('base64') >= 0) {
				// Convert base64 to raw binary data held in a string:
				byteString = atob(dataURI.split(',')[1]);
			} else {
				// Convert base64/URLEncoded data component to raw binary data:
				byteString = decodeURIComponent(dataURI.split(',')[1]);
			}
			// Write the bytes of the string to an ArrayBuffer:
			arrayBuffer = new ArrayBuffer(byteString.length);
			intArray = new Uint8Array(arrayBuffer);
			for (i = 0; i < byteString.length; i += 1) {
				intArray[i] = byteString.charCodeAt(i);
			}
			// Separate out the mime component:
			mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
			// Write the ArrayBuffer (or ArrayBufferView) to a blob:
			if (hasBlobConstructor) {
				return new Blob(
					[hasArrayBufferViewSupport ? intArray : arrayBuffer],
					{type: mimeString}
				);
			}
			bb = new BlobBuilder();
			bb.append(arrayBuffer);
			return bb.getBlob(mimeString);
		};
	if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) {
		if (CanvasPrototype.mozGetAsFile) {
			CanvasPrototype.toBlob = function (callback, type, quality) {
				if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) {
					callback(dataURLtoBlob(this.toDataURL(type, quality)));
				} else {
					callback(this.mozGetAsFile('blob', type));
				}
			};
		} else if (CanvasPrototype.toDataURL && dataURLtoBlob) {
			CanvasPrototype.toBlob = function (callback, type, quality) {
				callback(dataURLtoBlob(this.toDataURL(type, quality)));
			};
		}
	}
	window.dataURLtoBlob = dataURLtoBlob;
}(this));

webshim.isReady('canvas-blob', true);