169 lines
4.7 KiB
JavaScript
169 lines
4.7 KiB
JavaScript
/*global define*/
|
||
define(
|
||
[ 'util/browser', 'util/addpublishers', 'util/time', 'util/canvas', 'util/localizetext' ],
|
||
function ( browser, addPublishers , timeHelper, canvasHelper, loc ) {
|
||
// the imageModel loads and stores the latest open image file
|
||
// (the original, not the glitched version) and converts it into
|
||
// a imageData object
|
||
function ImageModel () {
|
||
if ( ! ( this instanceof ImageModel ) ) {
|
||
return new ImageModel();
|
||
}
|
||
|
||
var self = this;
|
||
var publishers = addPublishers( self, [ 'load', 'update', 'error', 'statusmessage' ] );
|
||
|
||
var canvasEl = document.createElement( 'canvas' );
|
||
var ctx = canvasEl.getContext( '2d' );
|
||
var imageEl = new Image();
|
||
|
||
var fileReader;
|
||
var canHandleFileImport = false;
|
||
var lastImageSrc;
|
||
var lastFileName;
|
||
|
||
// max image import filesize in megabytes.
|
||
// because of not 100% clear base64 url size constraints
|
||
// if the uploaded image is bigger, resize
|
||
// var maxFileSize = Math.pow(1024, 2) * 1.5;
|
||
var maxFileSize = 0.8 * Math.pow( 1000, 2 );
|
||
var isScalingDown = true;
|
||
|
||
if ( fileReader = browser.getFeature( window, 'FileReader' ) ) {
|
||
fileReader = new fileReader();
|
||
canHandleFileImport = true;
|
||
fileReader.addEventListener( 'load', fileLoaded );
|
||
fileReader.addEventListener( 'error', fileLoadFailed );
|
||
}
|
||
|
||
imageEl.addEventListener( 'load', imageLoaded );
|
||
imageEl.addEventListener( 'error', imageLoadFailed );
|
||
|
||
function loadFromFile ( file ) {
|
||
if ( canHandleFileImport ) {
|
||
lastFileName = file.name;
|
||
fileReader.readAsDataURL( file );
|
||
}
|
||
|
||
return self;
|
||
}
|
||
|
||
function loadFromVideo ( videoEl ) {
|
||
clearCanvas();
|
||
canvasEl.width = videoEl.width || videoEl.videoWidth || videoEl.clientWidth;
|
||
canvasEl.height = videoEl.height || videoEl.videoHeight || videoEl.clientHeight;
|
||
|
||
ctx.translate( canvasEl.width, 0 );
|
||
ctx.scale( -1, 1 );
|
||
ctx.drawImage( videoEl, 0, 0 );
|
||
|
||
lastImageSrc = canvasEl.toDataURL( 'image/png' );
|
||
lastFileName = loc( 'webcam.picture', timeHelper.dateTimeToLocalStr( new Date() ) );
|
||
|
||
checkImageData( ctx.getImageData( 0, 0, canvasEl.width, canvasEl.height ), publishers.load.dispatch );
|
||
|
||
return self;
|
||
}
|
||
|
||
function loadFromURL ( url, fileName ) {
|
||
if ( fileName ) {
|
||
lastFileName = fileName;
|
||
}
|
||
|
||
url = decodeURIComponent( url );
|
||
|
||
publishers.update.dispatch( 'img', url, fileName );
|
||
|
||
if ( url && imageEl.src !== url ) {
|
||
imageEl.src = '';
|
||
lastImageSrc = url;
|
||
imageEl.src = url;
|
||
} else {
|
||
imageLoaded();
|
||
}
|
||
|
||
return self;
|
||
}
|
||
|
||
function clearCanvas () {
|
||
ctx.clearRect( 0, 0, canvasEl.width, canvasEl.height );
|
||
}
|
||
|
||
function imageLoaded () {
|
||
var imageData = getImageData( imageEl );
|
||
|
||
checkImageData( imageData, publishers.load.dispatch );
|
||
}
|
||
|
||
function imageLoadFailed ( err ) {
|
||
publishers.error.dispatch( 'file.error.openimage', imageEl.src );
|
||
}
|
||
|
||
function fileLoaded ( event ) {
|
||
loadFromURL( event.target.result );
|
||
}
|
||
|
||
function fileLoadFailed ( error ) {
|
||
publishers.error.dispatch( 'file.error.openfile' );
|
||
}
|
||
|
||
function checkImageData ( imageData, callback ) {
|
||
if ( isScalingDown && imageData.data && imageData.data.length / 4 > maxFileSize ) {
|
||
var widthToHeightRatio = imageData.width / imageData.height;
|
||
var heightTiWidthRatio = imageData.height / imageData.width;
|
||
|
||
var newWidth = Math.round( Math.sqrt( maxFileSize / widthToHeightRatio ) );
|
||
var newHeight = Math.round( newWidth * heightTiWidthRatio );
|
||
var newSize = {
|
||
width: newWidth,
|
||
height: newHeight
|
||
};
|
||
|
||
publishers.statusmessage.dispatch( 'file.message.resize' );
|
||
|
||
canvasHelper.resizeImage( imageData, newSize, function ( result ) {
|
||
callback( result.imageData );
|
||
|
||
if ( typeof result.dataURL === 'string' ) {
|
||
lastImageSrc = result.dataURL;
|
||
}
|
||
}, 'both' );
|
||
} else {
|
||
callback( imageData );
|
||
}
|
||
}
|
||
|
||
function settingUpdated ( key, value ) {
|
||
if ( key === 'resizeUploadedImages' && typeof value === 'boolean' ) {
|
||
isScalingDown = value;
|
||
}
|
||
}
|
||
|
||
function getImageData ( img ) {
|
||
clearCanvas();
|
||
canvasEl.width = img.naturalWidth;
|
||
canvasEl.height = img.naturalHeight;
|
||
ctx.drawImage( img, 0, 0, img.naturalWidth, img.naturalHeight );
|
||
|
||
return ctx.getImageData( 0, 0, img.naturalWidth, img.naturalHeight );
|
||
}
|
||
|
||
function getLastImageSRC ( img ) {
|
||
return lastImageSrc;
|
||
}
|
||
|
||
function getLastFileName ( img ) {
|
||
return lastFileName;
|
||
}
|
||
|
||
self.loadFromFile = loadFromFile;
|
||
self.loadFromVideo = loadFromVideo;
|
||
self.getLastImageSRC = getLastImageSRC;
|
||
self.getLastFileName = getLastFileName;
|
||
self.loadFromURL = loadFromURL;
|
||
self.settingUpdated = settingUpdated;
|
||
}
|
||
|
||
return ImageModel;
|
||
}
|
||
); |