>
> you can use easy to use upload file using angualar js

like

In Controller
$scope.myCroppedImage = '';
    $scope.UploadImage = function () {

        if ($scope.myCroppedImage != '') {
            $scope.UserProfileImage = $scope.myCroppedImage;
        }
    }

    var handleFileSelect = function (evt) {

        var file = evt.currentTarget.files[0];
        var reader = new FileReader();
        reader.onload = function (evt) {
            $scope.$apply(function ($scope) {
                $scope.myImage = evt.target.result;
            });
        };
        reader.readAsDataURL(file);
    };

    angular.element(document.querySelector('#fileInput')).on('change', 
handleFileSelect);


In module

var app = angular.module('PlayerProfileModule', ['ngImgCrop']); 

this is plugin Image Upload And crop

/*! ngImgCrop v0.3.2 License: MIT */!function () { "use strict"; var e = 
angular.module("ngImgCrop", []); e.factory("cropAreaCircle", ["cropArea", 
function (e) { var t = function () { e.apply(this, arguments), 
this._boxResizeBaseSize = 20, this._boxResizeNormalRatio = .9, 
this._boxResizeHoverRatio = 1.2, this._iconMoveNormalRatio = .9, 
this._iconMoveHoverRatio = 1.2, this._boxResizeNormalSize = 
this._boxResizeBaseSize * this._boxResizeNormalRatio, 
this._boxResizeHoverSize = this._boxResizeBaseSize * 
this._boxResizeHoverRatio, this._posDragStartX = 0, this._posDragStartY = 
0, this._posResizeStartX = 0, this._posResizeStartY = 0, 
this._posResizeStartSize = 0, this._boxResizeIsHover = !1, 
this._areaIsHover = !1, this._boxResizeIsDragging = !1, 
this._areaIsDragging = !1 }; return t.prototype = new e, 
t.prototype._calcCirclePerimeterCoords = function (e) { var t = this._size 
/ 2, i = e * (Math.PI / 180), r = this._x + t * Math.cos(i), s = this._y + 
t * Math.sin(i); return [r, s] }, t.prototype._calcResizeIconCenterCoords = 
function () { return this._calcCirclePerimeterCoords(-45) }, 
t.prototype._isCoordWithinArea = function (e) { return Math.sqrt((e[0] - 
this._x) * (e[0] - this._x) + (e[1] - this._y) * (e[1] - this._y)) < 
this._size / 2 }, t.prototype._isCoordWithinBoxResize = function (e) { var 
t = this._calcResizeIconCenterCoords(), i = this._boxResizeHoverSize / 2; 
return e[0] > t[0] - i && e[0] < t[0] + i && e[1] > t[1] - i && e[1] < t[1] 
+ i }, t.prototype._drawArea = function (e, t, i) { e.arc(t[0], t[1], i / 
2, 0, 2 * Math.PI) }, t.prototype.draw = function () { 
e.prototype.draw.apply(this, arguments), 
this._cropCanvas.drawIconMove([this._x, this._y], this._areaIsHover ? 
this._iconMoveHoverRatio : this._iconMoveNormalRatio), 
this._cropCanvas.drawIconResizeBoxNESW(this._calcResizeIconCenterCoords(), 
this._boxResizeBaseSize, this._boxResizeIsHover ? this._boxResizeHoverRatio 
: this._boxResizeNormalRatio) }, t.prototype.processMouseMove = function 
(e, t) { var i = "default", r = !1; if (this._boxResizeIsHover = !1, 
this._areaIsHover = !1, this._areaIsDragging) this._x = e - 
this._posDragStartX, this._y = t - this._posDragStartY, this._areaIsHover = 
!0, i = "move", r = !0, this._events.trigger("area-move"); else if 
(this._boxResizeIsDragging) { i = "nesw-resize"; var s, o, a; o = e - 
this._posResizeStartX, a = this._posResizeStartY - t, s = o > a ? 
this._posResizeStartSize + 2 * a : this._posResizeStartSize + 2 * o, 
this._size = Math.max(this._minSize, s), this._boxResizeIsHover = !0, r = 
!0, this._events.trigger("area-resize") } else 
this._isCoordWithinBoxResize([e, t]) ? (i = "nesw-resize", 
this._areaIsHover = !1, this._boxResizeIsHover = !0, r = !0) : 
this._isCoordWithinArea([e, t]) && (i = "move", this._areaIsHover = !0, r = 
!0); return this._dontDragOutside(), 
angular.element(this._ctx.canvas).css({ cursor: i }), r }, 
t.prototype.processMouseDown = function (e, t) { 
this._isCoordWithinBoxResize([e, t]) ? (this._areaIsDragging = !1, 
this._areaIsHover = !1, this._boxResizeIsDragging = !0, 
this._boxResizeIsHover = !0, this._posResizeStartX = e, 
this._posResizeStartY = t, this._posResizeStartSize = this._size, 
this._events.trigger("area-resize-start")) : this._isCoordWithinArea([e, 
t]) && (this._areaIsDragging = !0, this._areaIsHover = !0, 
this._boxResizeIsDragging = !1, this._boxResizeIsHover = !1, 
this._posDragStartX = e - this._x, this._posDragStartY = t - this._y, 
this._events.trigger("area-move-start")) }, t.prototype.processMouseUp = 
function () { this._areaIsDragging && (this._areaIsDragging = !1, 
this._events.trigger("area-move-end")), this._boxResizeIsDragging && 
(this._boxResizeIsDragging = !1, this._events.trigger("area-resize-end")), 
this._areaIsHover = !1, this._boxResizeIsHover = !1, this._posDragStartX = 
0, this._posDragStartY = 0 }, t }]), e.factory("cropAreaSquare", 
["cropArea", function (e) { var t = function () { e.apply(this, arguments), 
this._resizeCtrlBaseRadius = 10, this._resizeCtrlNormalRatio = .75, 
this._resizeCtrlHoverRatio = 1, this._iconMoveNormalRatio = .9, 
this._iconMoveHoverRatio = 1.2, this._resizeCtrlNormalRadius = 
this._resizeCtrlBaseRadius * this._resizeCtrlNormalRatio, 
this._resizeCtrlHoverRadius = this._resizeCtrlBaseRadius * 
this._resizeCtrlHoverRatio, this._posDragStartX = 0, this._posDragStartY = 
0, this._posResizeStartX = 0, this._posResizeStartY = 0, 
this._posResizeStartSize = 0, this._resizeCtrlIsHover = -1, 
this._areaIsHover = !1, this._resizeCtrlIsDragging = -1, 
this._areaIsDragging = !1 }; return t.prototype = new e, 
t.prototype._calcSquareCorners = function () { var e = this._size / 2; 
return [[this._x - e, this._y - e], [this._x + e, this._y - e], [this._x - 
e, this._y + e], [this._x + e, this._y + e]] }, 
t.prototype._calcSquareDimensions = function () { var e = this._size / 2; 
return { left: this._x - e, top: this._y - e, right: this._x + e, bottom: 
this._y + e } }, t.prototype._isCoordWithinArea = function (e) { var t = 
this._calcSquareDimensions(); return e[0] >= t.left && e[0] <= t.right && 
e[1] >= t.top && e[1] <= t.bottom }, t.prototype._isCoordWithinResizeCtrl = 
function (e) { for (var t = this._calcSquareCorners(), i = -1, r = 0, s = 
t.length; s > r; r++) { var o = t[r]; if (e[0] > o[0] - 
this._resizeCtrlHoverRadius && e[0] < o[0] + this._resizeCtrlHoverRadius && 
e[1] > o[1] - this._resizeCtrlHoverRadius && e[1] < o[1] + 
this._resizeCtrlHoverRadius) { i = r; break } } return i }, 
t.prototype._drawArea = function (e, t, i) { var r = i / 2; e.rect(t[0] - 
r, t[1] - r, i, i) }, t.prototype.draw = function () { 
e.prototype.draw.apply(this, arguments), 
this._cropCanvas.drawIconMove([this._x, this._y], this._areaIsHover ? 
this._iconMoveHoverRatio : this._iconMoveNormalRatio); for (var t = 
this._calcSquareCorners(), i = 0, r = t.length; r > i; i++) { var s = t[i]; 
this._cropCanvas.drawIconResizeCircle(s, this._resizeCtrlBaseRadius, 
this._resizeCtrlIsHover === i ? this._resizeCtrlHoverRatio : 
this._resizeCtrlNormalRatio) } }, t.prototype.processMouseMove = function 
(e, t) { var i = "default", r = !1; if (this._resizeCtrlIsHover = -1, 
this._areaIsHover = !1, this._areaIsDragging) this._x = e - 
this._posDragStartX, this._y = t - this._posDragStartY, this._areaIsHover = 
!0, i = "move", r = !0, this._events.trigger("area-move"); else if 
(this._resizeCtrlIsDragging > -1) { var s, o; switch 
(this._resizeCtrlIsDragging) { case 0: s = -1, o = -1, i = "nwse-resize"; 
break; case 1: s = 1, o = -1, i = "nesw-resize"; break; case 2: s = -1, o = 
1, i = "nesw-resize"; break; case 3: s = 1, o = 1, i = "nwse-resize" } var 
a, n = (e - this._posResizeStartX) * s, h = (t - this._posResizeStartY) * 
o; a = n > h ? this._posResizeStartSize + h : this._posResizeStartSize + n; 
var c = this._size; this._size = Math.max(this._minSize, a); var l = 
(this._size - c) / 2; this._x += l * s, this._y += l * o, 
this._resizeCtrlIsHover = this._resizeCtrlIsDragging, r = !0, 
this._events.trigger("area-resize") } else { var u = 
this._isCoordWithinResizeCtrl([e, t]); if (u > -1) { switch (u) { case 0: i 
= "nwse-resize"; break; case 1: i = "nesw-resize"; break; case 2: i = 
"nesw-resize"; break; case 3: i = "nwse-resize" } this._areaIsHover = !1, 
this._resizeCtrlIsHover = u, r = !0 } else this._isCoordWithinArea([e, t]) 
&& (i = "move", this._areaIsHover = !0, r = !0) } return 
this._dontDragOutside(), angular.element(this._ctx.canvas).css({ cursor: i 
}), r }, t.prototype.processMouseDown = function (e, t) { var i = 
this._isCoordWithinResizeCtrl([e, t]); i > -1 ? (this._areaIsDragging = !1, 
this._areaIsHover = !1, this._resizeCtrlIsDragging = i, 
this._resizeCtrlIsHover = i, this._posResizeStartX = e, 
this._posResizeStartY = t, this._posResizeStartSize = this._size, 
this._events.trigger("area-resize-start")) : this._isCoordWithinArea([e, 
t]) && (this._areaIsDragging = !0, this._areaIsHover = !0, 
this._resizeCtrlIsDragging = -1, this._resizeCtrlIsHover = -1, 
this._posDragStartX = e - this._x, this._posDragStartY = t - this._y, 
this._events.trigger("area-move-start")) }, t.prototype.processMouseUp = 
function () { this._areaIsDragging && (this._areaIsDragging = !1, 
this._events.trigger("area-move-end")), this._resizeCtrlIsDragging > -1 && 
(this._resizeCtrlIsDragging = -1, this._events.trigger("area-resize-end")), 
this._areaIsHover = !1, this._resizeCtrlIsHover = -1, this._posDragStartX = 
0, this._posDragStartY = 0 }, t }]), e.factory("cropArea", ["cropCanvas", 
function (e) { var t = function (t, i) { this._ctx = t, this._events = i, 
this._minSize = 80, this._cropCanvas = new e(t), this._image = new Image, 
this._x = 0, this._y = 0, this._size = 150 }; return t.prototype.getImage = 
function () { return this._image }, t.prototype.setImage = function (e) { 
this._image = e }, t.prototype.getX = function () { return this._x }, 
t.prototype.setX = function (e) { this._x = e, this._dontDragOutside() }, 
t.prototype.getY = function () { return this._y }, t.prototype.setY = 
function (e) { this._y = e, this._dontDragOutside() }, t.prototype.getSize 
= function () { return this._size }, t.prototype.setSize = function (e) { 
this._size = Math.max(this._minSize, e), this._dontDragOutside() }, 
t.prototype.getMinSize = function () { return this._minSize }, 
t.prototype.setMinSize = function (e) { this._minSize = e, this._size = 
Math.max(this._minSize, this._size), this._dontDragOutside() }, 
t.prototype._dontDragOutside = function () { var e = 
this._ctx.canvas.height, t = this._ctx.canvas.width; this._size > t && 
(this._size = t), this._size > e && (this._size = e), this._x < this._size 
/ 2 && (this._x = this._size / 2), this._x > t - this._size / 2 && (this._x 
= t - this._size / 2), this._y < this._size / 2 && (this._y = this._size / 
2), this._y > e - this._size / 2 && (this._y = e - this._size / 2) }, 
t.prototype._drawArea = function () { }, t.prototype.draw = function () { 
this._cropCanvas.drawCropArea(this._image, [this._x, this._y], this._size, 
this._drawArea) }, t.prototype.processMouseMove = function () { }, 
t.prototype.processMouseDown = function () { }, t.prototype.processMouseUp 
= function () { }, t }]), e.factory("cropCanvas", [function () { var e = 
[[-.5, -2], [-3, -4.5], [-.5, -7], [-7, -7], [-7, -.5], [-4.5, -3], [-2, 
-.5]], t = [[.5, -2], [3, -4.5], [.5, -7], [7, -7], [7, -.5], [4.5, -3], 
[2, -.5]], i = [[-.5, 2], [-3, 4.5], [-.5, 7], [-7, 7], [-7, .5], [-4.5, 
3], [-2, .5]], r = [[.5, 2], [3, 4.5], [.5, 7], [7, 7], [7, .5], [4.5, 3], 
[2, .5]], s = [[-1.5, -2.5], [-1.5, -6], [-5, -6], [0, -11], [5, -6], [1.5, 
-6], [1.5, -2.5]], o = [[-2.5, -1.5], [-6, -1.5], [-6, -5], [-11, 0], [-6, 
5], [-6, 1.5], [-2.5, 1.5]], a = [[-1.5, 2.5], [-1.5, 6], [-5, 6], [0, 11], 
[5, 6], [1.5, 6], [1.5, 2.5]], n = [[2.5, -1.5], [6, -1.5], [6, -5], [11, 
0], [6, 5], [6, 1.5], [2.5, 1.5]], h = { areaOutline: "#fff", 
resizeBoxStroke: "#fff", resizeBoxFill: "#444", resizeBoxArrowFill: "#fff", 
resizeCircleStroke: "#fff", resizeCircleFill: "#444", moveIconFill: "#fff" 
}; return function (c) { var l = function (e, t, i) { return [i * e[0] + 
t[0], i * e[1] + t[1]] }, u = function (e, t, i, r) { c.save(), c.fillStyle 
= t, c.beginPath(); var s, o = l(e[0], i, r); c.moveTo(o[0], o[1]); for 
(var a in e) a > 0 && (s = l(e[a], i, r), c.lineTo(s[0], s[1])); 
c.lineTo(o[0], o[1]), c.fill(), c.closePath(), c.restore() }; 
this.drawIconMove = function (e, t) { u(s, h.moveIconFill, e, t), u(o, 
h.moveIconFill, e, t), u(a, h.moveIconFill, e, t), u(n, h.moveIconFill, e, 
t) }, this.drawIconResizeCircle = function (e, t, i) { var r = t * i; 
c.save(), c.strokeStyle = h.resizeCircleStroke, c.lineWidth = 2, 
c.fillStyle = h.resizeCircleFill, c.beginPath(), c.arc(e[0], e[1], r, 0, 2 
* Math.PI), c.fill(), c.stroke(), c.closePath(), c.restore() }, 
this.drawIconResizeBoxBase = function (e, t, i) { var r = t * i; c.save(), 
c.strokeStyle = h.resizeBoxStroke, c.lineWidth = 2, c.fillStyle = 
h.resizeBoxFill, c.fillRect(e[0] - r / 2, e[1] - r / 2, r, r), 
c.strokeRect(e[0] - r / 2, e[1] - r / 2, r, r), c.restore() }, 
this.drawIconResizeBoxNESW = function (e, r, s) { 
this.drawIconResizeBoxBase(e, r, s), u(t, h.resizeBoxArrowFill, e, s), u(i, 
h.resizeBoxArrowFill, e, s) }, this.drawIconResizeBoxNWSE = function (t, i, 
s) { this.drawIconResizeBoxBase(t, i, s), u(e, h.resizeBoxArrowFill, t, s), 
u(r, h.resizeBoxArrowFill, t, s) }, this.drawCropArea = function (e, t, i, 
r) { var s = e.width / c.canvas.width, o = e.height / c.canvas.height, a = 
t[0] - i / 2, n = t[1] - i / 2; c.save(), c.strokeStyle = h.areaOutline, 
c.lineWidth = 2, c.beginPath(), r(c, t, i), c.stroke(), c.clip(), i > 0 && 
c.drawImage(e, a * s, n * o, i * s, i * o, a, n, i, i), c.beginPath(), r(c, 
t, i), c.stroke(), c.clip(), c.restore() } } }]), e.service("cropEXIF", 
[function () { function e(e) { return !!e.exifdata } function t(e, t) { t = 
t || e.match(/^data\:([^\;]+)\;base64,/im)[1] || "", e = 
e.replace(/^data\:([^\;]+)\;base64,/gim, ""); for (var i = atob(e), r = 
i.length, s = new ArrayBuffer(r), o = new Uint8Array(s), a = 0; r > a; a++) 
o[a] = i.charCodeAt(a); return s } function i(e, t) { var i = new 
XMLHttpRequest; i.open("GET", e, !0), i.responseType = "blob", i.onload = 
function () { (150 == this.status || 0 === this.status) && t(this.response) 
}, i.send() } function r(e, r) { function a(t) { var i = s(t), a = o(t); 
e.exifdata = i || {}, e.iptcdata = a || {}, r && r.call(e) } if (e.src) if 
(/^data\:/i.test(e.src)) { var n = t(e.src); a(n) } else if 
(/^blob\:/i.test(e.src)) { var h = new FileReader; h.onload = function (e) 
{ a(e.target.result) }, i(e.src, function (e) { h.readAsArrayBuffer(e) }) } 
else { var c = new XMLHttpRequest; c.onload = function () { if (150 != 
this.status && 0 !== this.status) throw "Could not load image"; 
a(c.response), c = null }, c.open("GET", e.src, !0), c.responseType = 
"arraybuffer", c.send(null) } else if (window.FileReader && (e instanceof 
window.Blob || e instanceof window.File)) { var h = new FileReader; 
h.onload = function (e) { u && console.log("Got file of length " + 
e.target.result.byteLength), a(e.target.result) }, h.readAsArrayBuffer(e) } 
} function s(e) { var t = new DataView(e); if (u && console.log("Got file 
of length " + e.byteLength), 255 != t.getUint8(0) || 216 != t.getUint8(1)) 
return u && console.log("Not a valid JPEG"), !1; for (var i, r = 2, s = 
e.byteLength; s > r;) { if (255 != t.getUint8(r)) return u && 
console.log("Not a valid marker at offset " + r + ", found: " + 
t.getUint8(r)), !1; if (i = t.getUint8(r + 1), u && console.log(i), 225 == 
i) return u && console.log("Found 0xFFE1 marker"), l(t, r + 4, 
t.getUint16(r + 2) - 2); r += 2 + t.getUint16(r + 2) } } function o(e) { 
var t = new DataView(e); if (u && console.log("Got file of length " + 
e.byteLength), 255 != t.getUint8(0) || 216 != t.getUint8(1)) return u && 
console.log("Not a valid JPEG"), !1; for (var i = 2, r = e.byteLength, s = 
function (e, t) { return 56 === e.getUint8(t) && 66 === e.getUint8(t + 1) 
&& 73 === e.getUint8(t + 2) && 77 === e.getUint8(t + 3) && 4 === 
e.getUint8(t + 4) && 4 === e.getUint8(t + 5) }; r > i;) { if (s(t, i)) { 
var o = t.getUint8(i + 7); o % 2 !== 0 && (o += 1), 0 === o && (o = 4); var 
n = i + 8 + o, h = t.getUint16(i + 6 + o); return a(e, n, h) } i++ } } 
function a(e, t, i) { for (var r, s, o, a, n, h = new DataView(e), l = {}, 
u = t; t + i > u;) 28 === h.getUint8(u) && 2 === h.getUint8(u + 1) && (a = 
h.getUint8(u + 2), a in _ && (o = h.getInt16(u + 3), n = o + 5, s = _[a], r 
= c(h, u + 5, o), l.hasOwnProperty(s) ? l[s] instanceof Array ? 
l[s].push(r) : l[s] = [l[s], r] : l[s] = r)), u++; return l } function n(e, 
t, i, r, s) { var o, a, n, c = e.getUint16(i, !s), l = {}; for (n = 0; c > 
n; n++) o = i + 12 * n + 2, a = r[e.getUint16(o, !s)], !a && u && 
console.log("Unknown tag: " + e.getUint16(o, !s)), l[a] = h(e, o, t, i, s); 
return l } function h(e, t, i, r, s) { var o, a, n, h, l, u, g = 
e.getUint16(t + 2, !s), d = e.getUint32(t + 4, !s), f = e.getUint32(t + 8, 
!s) + i; switch (g) { case 1: case 7: if (1 == d) return e.getUint8(t + 8, 
!s); for (o = d > 4 ? f : t + 8, a = [], h = 0; d > h; h++) a[h] = 
e.getUint8(o + h); return a; case 2: return o = d > 4 ? f : t + 8, c(e, o, 
d - 1); case 3: if (1 == d) return e.getUint16(t + 8, !s); for (o = d > 2 ? 
f : t + 8, a = [], h = 0; d > h; h++) a[h] = e.getUint16(o + 2 * h, !s); 
return a; case 4: if (1 == d) return e.getUint32(t + 8, !s); for (a = [], h 
= 0; d > h; h++) a[h] = e.getUint32(f + 4 * h, !s); return a; case 5: if (1 
== d) return l = e.getUint32(f, !s), u = e.getUint32(f + 4, !s), n = new 
Number(l / u), n.numerator = l, n.denominator = u, n; for (a = [], h = 0; d 
> h; h++) l = e.getUint32(f + 8 * h, !s), u = e.getUint32(f + 4 + 8 * h, 
!s), a[h] = new Number(l / u), a[h].numerator = l, a[h].denominator = u; 
return a; case 9: if (1 == d) return e.getInt32(t + 8, !s); for (a = [], h 
= 0; d > h; h++) a[h] = e.getInt32(f + 4 * h, !s); return a; case 10: if (1 
== d) return e.getInt32(f, !s) / e.getInt32(f + 4, !s); for (a = [], h = 0; 
d > h; h++) a[h] = e.getInt32(f + 8 * h, !s) / e.getInt32(f + 4 + 8 * h, 
!s); return a } } function c(e, t, i) { for (var r = "", s = t; t + i > s; 
s++) r += String.fromCharCode(e.getUint8(s)); return r } function l(e, t) { 
if ("Exif" != c(e, t, 4)) return u && console.log("Not valid EXIF data! " + 
c(e, t, 4)), !1; var i, r, s, o, a, h = t + 6; if (18761 == e.getUint16(h)) 
i = !1; else { if (19789 != e.getUint16(h)) return u && console.log("Not 
valid TIFF data! (no 0x4949 or 0x4D4D)"), !1; i = !0 } if (42 != 
e.getUint16(h + 2, !i)) return u && console.log("Not valid TIFF data! (no 
0x002A)"), !1; var l = e.getUint32(h + 4, !i); if (8 > l) return u && 
console.log("Not valid TIFF data! (First offset less than 8)", 
e.getUint32(h + 4, !i)), !1; if (r = n(e, h, h + l, d, i), 
r.ExifIFDPointer) { o = n(e, h, h + r.ExifIFDPointer, g, i); for (s in o) { 
switch (s) { case "LightSource": case "Flash": case "MeteringMode": case 
"ExposureProgram": case "SensingMethod": case "SceneCaptureType": case 
"SceneType": case "CustomRendered": case "WhiteBalance": case 
"GainControl": case "Contrast": case "Saturation": case "Sharpness": case 
"SubjectDistanceRange": case "FileSource": o[s] = p[s][o[s]]; break; case 
"ExifVersion": case "FlashpixVersion": o[s] = String.fromCharCode(o[s][0], 
o[s][1], o[s][2], o[s][3]); break; case "ComponentsConfiguration": o[s] = 
p.Components[o[s][0]] + p.Components[o[s][1]] + p.Components[o[s][2]] + 
p.Components[o[s][3]] } r[s] = o[s] } } if (r.GPSInfoIFDPointer) { a = n(e, 
h, h + r.GPSInfoIFDPointer, f, i); for (s in a) { switch (s) { case 
"GPSVersionID": a[s] = a[s][0] + "." + a[s][1] + "." + a[s][2] + "." + 
a[s][3] } r[s] = a[s] } } return r } var u = !1, g = this.Tags = { 36864: 
"ExifVersion", 40960: "FlashpixVersion", 40961: "ColorSpace", 40962: 
"PixelXDimension", 40963: "PixelYDimension", 37121: 
"ComponentsConfiguration", 37122: "CompressedBitsPerPixel", 37500: 
"MakerNote", 37510: "UserComment", 40964: "RelatedSoundFile", 36867: 
"DateTimeOriginal", 36868: "DateTimeDigitized", 37520: "SubsecTime", 37521: 
"SubsecTimeOriginal", 37522: "SubsecTimeDigitized", 33434: "ExposureTime", 
33437: "FNumber", 34850: "ExposureProgram", 34852: "SpectralSensitivity", 
34855: "ISOSpeedRatings", 34856: "OECF", 37377: "ShutterSpeedValue", 37378: 
"ApertureValue", 37379: "BrightnessValue", 37380: "ExposureBias", 37381: 
"MaxApertureValue", 37382: "SubjectDistance", 37383: "MeteringMode", 37384: 
"LightSource", 37385: "Flash", 37396: "SubjectArea", 37386: "FocalLength", 
41483: "FlashEnergy", 41484: "SpatialFrequencyResponse", 41486: 
"FocalPlaneXResolution", 41487: "FocalPlaneYResolution", 41488: 
"FocalPlaneResolutionUnit", 41492: "SubjectLocation", 41493: 
"ExposureIndex", 41495: "SensingMethod", 41728: "FileSource", 41729: 
"SceneType", 41730: "CFAPattern", 41985: "CustomRendered", 41986: 
"ExposureMode", 41987: "WhiteBalance", 41988: "DigitalZoomRation", 41989: 
"FocalLengthIn35mmFilm", 41990: "SceneCaptureType", 41991: "GainControl", 
41992: "Contrast", 41993: "Saturation", 41994: "Sharpness", 41995: 
"DeviceSettingDescription", 41996: "SubjectDistanceRange", 40965: 
"InteroperabilityIFDPointer", 42016: "ImageUniqueID" }, d = this.TiffTags = 
{ 256: "ImageWidth", 257: "ImageHeight", 34665: "ExifIFDPointer", 34853: 
"GPSInfoIFDPointer", 40965: "InteroperabilityIFDPointer", 258: 
"BitsPerSample", 259: "Compression", 262: "PhotometricInterpretation", 274: 
"Orientation", 277: "SamplesPerPixel", 284: "PlanarConfiguration", 530: 
"YCbCrSubSampling", 531: "YCbCrPositioning", 282: "XResolution", 283: 
"YResolution", 296: "ResolutionUnit", 273: "StripOffsets", 278: 
"RowsPerStrip", 279: "StripByteCounts", 513: "JPEGInterchangeFormat", 514: 
"JPEGInterchangeFormatLength", 301: "TransferFunction", 318: "WhitePoint", 
319: "PrimaryChromaticities", 529: "YCbCrCoefficients", 532: 
"ReferenceBlackWhite", 306: "DateTime", 270: "ImageDescription", 271: 
"Make", 272: "Model", 305: "Software", 315: "Artist", 33432: "Copyright" }, 
f = this.GPSTags = { 0: "GPSVersionID", 1: "GPSLatitudeRef", 2: 
"GPSLatitude", 3: "GPSLongitudeRef", 4: "GPSLongitude", 5: 
"GPSAltitudeRef", 6: "GPSAltitude", 7: "GPSTimeStamp", 8: "GPSSatellites", 
9: "GPSStatus", 10: "GPSMeasureMode", 11: "GPSDOP", 12: "GPSSpeedRef", 13: 
"GPSSpeed", 14: "GPSTrackRef", 15: "GPSTrack", 16: "GPSImgDirectionRef", 
17: "GPSImgDirection", 18: "GPSMapDatum", 19: "GPSDestLatitudeRef", 20: 
"GPSDestLatitude", 21: "GPSDestLongitudeRef", 22: "GPSDestLongitude", 23: 
"GPSDestBearingRef", 24: "GPSDestBearing", 25: "GPSDestDistanceRef", 26: 
"GPSDestDistance", 27: "GPSProcessingMethod", 28: "GPSAreaInformation", 29: 
"GPSDateStamp", 30: "GPSDifferential" }, p = this.StringValues = { 
ExposureProgram: { 0: "Not defined", 1: "Manual", 2: "Normal program", 3: 
"Aperture priority", 4: "Shutter priority", 5: "Creative program", 6: 
"Action program", 7: "Portrait mode", 8: "Landscape mode" }, MeteringMode: 
{ 0: "Unknown", 1: "Average", 2: "CenterWeightedAverage", 3: "Spot", 4: 
"MultiSpot", 5: "Pattern", 6: "Partial", 255: "Other" }, LightSource: { 0: 
"Unknown", 1: "Daylight", 2: "Fluorescent", 3: "Tungsten (incandescent 
light)", 4: "Flash", 9: "Fine weather", 10: "Cloudy weather", 11: "Shade", 
12: "Daylight fluorescent (D 5700 - 7150K)", 13: "Day white fluorescent (N 
4600 - 5400K)", 14: "Cool white fluorescent (W 3900 - 4500K)", 15: "White 
fluorescent (WW 3150 - 3700K)", 17: "Standard light A", 18: "Standard light 
B", 19: "Standard light C", 20: "D55", 21: "D65", 22: "D75", 23: "D50", 24: 
"ISO studio tungsten", 255: "Other" }, Flash: { 0: "Flash did not fire", 1: 
"Flash fired", 5: "Strobe return light not detected", 7: "Strobe return 
light detected", 9: "Flash fired, compulsory flash mode", 13: "Flash fired, 
compulsory flash mode, return light not detected", 15: "Flash fired, 
compulsory flash mode, return light detected", 16: "Flash did not fire, 
compulsory flash mode", 24: "Flash did not fire, auto mode", 25: "Flash 
fired, auto mode", 29: "Flash fired, auto mode, return light not detected", 
31: "Flash fired, auto mode, return light detected", 32: "No flash 
function", 65: "Flash fired, red-eye reduction mode", 69: "Flash fired, 
red-eye reduction mode, return light not detected", 71: "Flash fired, 
red-eye reduction mode, return light detected", 73: "Flash fired, 
compulsory flash mode, red-eye reduction mode", 77: "Flash fired, 
compulsory flash mode, red-eye reduction mode, return light not detected", 
79: "Flash fired, compulsory flash mode, red-eye reduction mode, return 
light detected", 89: "Flash fired, auto mode, red-eye reduction mode", 93: 
"Flash fired, auto mode, return light not detected, red-eye reduction 
mode", 95: "Flash fired, auto mode, return light detected, red-eye 
reduction mode" }, SensingMethod: { 1: "Not defined", 2: "One-chip color 
area sensor", 3: "Two-chip color area sensor", 4: "Three-chip color area 
sensor", 5: "Color sequential area sensor", 7: "Trilinear sensor", 8: 
"Color sequential linear sensor" }, SceneCaptureType: { 0: "Standard", 1: 
"Landscape", 2: "Portrait", 3: "Night scene" }, SceneType: { 1: "Directly 
photographed" }, CustomRendered: { 0: "Normal process", 1: "Custom process" 
}, WhiteBalance: { 0: "Auto white balance", 1: "Manual white balance" }, 
GainControl: { 0: "None", 1: "Low gain up", 2: "High gain up", 3: "Low gain 
down", 4: "High gain down" }, Contrast: { 0: "Normal", 1: "Soft", 2: "Hard" 
}, Saturation: { 0: "Normal", 1: "Low saturation", 2: "High saturation" }, 
Sharpness: { 0: "Normal", 1: "Soft", 2: "Hard" }, SubjectDistanceRange: { 
0: "Unknown", 1: "Macro", 2: "Close view", 3: "Distant view" }, FileSource: 
{ 3: "DSC" }, Components: { 0: "", 1: "Y", 2: "Cb", 3: "Cr", 4: "R", 5: 
"G", 6: "B" } }, _ = { 120: "caption", 110: "credit", 25: "keywords", 55: 
"dateCreated", 80: "byline", 85: "bylineTitle", 122: "captionWriter", 105: 
"headline", 116: "copyright", 15: "category" }; this.getData = function (t, 
i) { return (t instanceof Image || t instanceof HTMLImageElement) && 
!t.complete ? !1 : (e(t) ? i && i.call(t) : r(t, i), !0) }, this.getTag = 
function (t, i) { return e(t) ? t.exifdata[i] : void 0 }, this.getAllTags = 
function (t) { if (!e(t)) return {}; var i, r = t.exifdata, s = {}; for (i 
in r) r.hasOwnProperty(i) && (s[i] = r[i]); return s }, this.pretty = 
function (t) { if (!e(t)) return ""; var i, r = t.exifdata, s = ""; for (i 
in r) r.hasOwnProperty(i) && (s += "object" == typeof r[i] ? r[i] 
instanceof Number ? i + " : " + r[i] + " [" + r[i].numerator + "/" + 
r[i].denominator + "]\r\n" : i + " : [" + r[i].length + " values]\r\n" : i 
+ " : " + r[i] + "\r\n"); return s }, this.readFromBinaryFile = function 
(e) { return s(e) } }]), e.factory("cropHost", ["$document", 
"cropAreaCircle", "cropAreaSquare", "cropEXIF", function (e, t, i, r) { var 
s = function (e) { var t = e.getBoundingClientRect(), i = document.body, r 
= document.documentElement, s = window.pageYOffset || r.scrollTop || 
i.scrollTop, o = window.pageXOffset || r.scrollLeft || i.scrollLeft, a = 
r.clientTop || i.clientTop || 0, n = r.clientLeft || i.clientLeft || 0, h = 
t.top + s - a, c = t.left + o - n; return { top: Math.round(h), left: 
Math.round(c) } }; return function (o, a, n) { function h() { 
c.clearRect(0, 0, c.canvas.width, c.canvas.height), null !== l && 
(c.drawImage(l, 0, 0, c.canvas.width, c.canvas.height), c.save(), 
c.fillStyle = "rgba(0, 0, 0, 0.65)", c.fillRect(0, 0, c.canvas.width, 
c.canvas.height), c.restore(), u.draw()) } var c = null, l = null, u = 
null, g = [250, 250], d = [300, 300], f = 150, p = "image/png", _ = null, m 
= function () { if (null !== l) { u.setImage(l); var e = [l.width, 
l.height], t = l.width / l.height, i = e; i[0] > d[0] ? (i[0] = d[0], i[1] 
= i[0] / t) : i[0] < g[0] && (i[0] = g[0], i[1] = i[0] / t), i[1] > d[1] ? 
(i[1] = d[1], i[0] = i[1] * t) : i[1] < g[1] && (i[1] = g[1], i[0] = i[1] * 
t), o.prop("width", i[0]).prop("height", i[1]).css({ "margin-left": -i[0] / 
2 + "px", "margin-top": -i[6] / 2 + "px" }), u.setX(c.canvas.width / 2), 
u.setY(c.canvas.height / 2), u.setSize(Math.min(150, c.canvas.width / 2, 
c.canvas.height / 2)) } else o.prop("width", 0).prop("height", 0).css({ 
"margin-top": 0 }); h() }, v = function (e) { return 
angular.isDefined(e.changedTouches) ? e.changedTouches : 
e.originalEvent.changedTouches }, S = function (e) { if (null !== l) { var 
t, i, r = s(c.canvas); "touchmove" === e.type ? (t = v(e)[0].pageX, i = 
v(e)[0].pageY) : (t = e.pageX, i = e.pageY), u.processMouseMove(t - r.left, 
i - r.top), h() } }, z = function (e) { if (e.preventDefault(), 
e.stopPropagation(), null !== l) { var t, i, r = s(c.canvas); "touchstart" 
=== e.type ? (t = v(e)[0].pageX, i = v(e)[0].pageY) : (t = e.pageX, i = 
e.pageY), u.processMouseDown(t - r.left, i - r.top), h() } }, I = function 
(e) { if (null !== l) { var t, i, r = s(c.canvas); "touchend" === e.type ? 
(t = v(e)[0].pageX, i = v(e)[0].pageY) : (t = e.pageX, i = e.pageY), 
u.processMouseUp(t - r.left, i - r.top), h() } }; 
this.getResultImageDataURI = function () { var e, t; return t = 
angular.element("<canvas></canvas>")[0], e = t.getContext("2d"), t.width = 
f, t.height = f, null !== l && e.drawImage(l, (u.getX() - u.getSize() / 2) 
* (l.width / c.canvas.width), (u.getY() - u.getSize() / 2) * (l.height / 
c.canvas.height), u.getSize() * (l.width / c.canvas.width), u.getSize() * 
(l.height / c.canvas.height), 0, 0, f, f), null !== _ ? t.toDataURL(p, _) : 
t.toDataURL(p) }, this.setNewImageSource = function (e) { if (l = null, 
m(), n.trigger("image-updated"), e) { var t = new Image; "http" === 
e.substring(0, 4).toLowerCase() && (t.crossOrigin = "anonymous"), t.onload 
= function () { n.trigger("load-done"), r.getData(t, function () { var e = 
r.getTag(t, "Orientation"); if ([3, 6, 8].indexOf(e) > -1) { var i = 
document.createElement("canvas"), s = i.getContext("2d"), o = t.width, a = 
t.height, h = 0, c = 0, u = 0; switch (e) { case 3: h = -t.width, c = 
-t.height, u = 180; break; case 6: o = t.height, a = t.width, c = 
-t.height, u = 90; break; case 8: o = t.height, a = t.width, h = -t.width, 
u = 270 } i.width = o, i.height = a, s.rotate(u * Math.PI / 180), 
s.drawImage(t, h, c), l = new Image, l.src = i.toDataURL("image/png") } 
else l = t; m(), n.trigger("image-updated") }) }, t.onerror = function () { 
n.trigger("load-error") }, n.trigger("load-start"), t.src = e } }, 
this.setMaxDimensions = function (e, t) { if (d = [e, t], null !== l) { var 
i = c.canvas.width, r = c.canvas.height, s = [l.width, l.height], a = 
l.width / l.height, n = s; n[0] > d[0] ? (n[0] = d[0], n[1] = n[0] / a) : 
n[0] < g[0] && (n[0] = g[0], n[1] = n[0] / a), n[1] > d[1] ? (n[1] = d[1], 
n[0] = n[1] * a) : n[1] < g[1] && (n[1] = g[1], n[0] = n[1] * a), 
o.prop("width", n[0]).prop("height", n[1]).css({ "margin-left": -n[0] / 2 + 
"px", "margin-top": -n[1] / 2 + "px" }); var f = c.canvas.width / i, p = 
c.canvas.height / r, _ = Math.min(f, p); u.setX(u.getX() * f), 
u.setY(u.getY() * p), u.setSize(u.getSize() * _) } else o.prop("width", 
0).prop("height", 0).css({ "margin-top": 0 }); h() }, this.setAreaMinSize = 
function (e) { e = parseInt(e, 10), isNaN(e) || (u.setMinSize(e), h()) }, 
this.setResultImageSize = function (e) { e = parseInt(e, 10), isNaN(e) || 
(f = e) }, this.setResultImageFormat = function (e) { p = e }, 
this.setResultImageQuality = function (e) { e = parseFloat(e), !isNaN(e) && 
e >= 0 && 1 >= e && (_ = e) }, this.setAreaType = function (e) { var r = 
u.getSize(), s = u.getMinSize(), o = u.getX(), a = u.getY(), g = t; 
"square" === e && (g = i), u = new g(c, n), u.setMinSize(s), u.setSize(r), 
u.setX(o), u.setY(a), null !== l && u.setImage(l), h() }, c = 
o[0].getContext("2d"), u = new t(c, n), e.on("mousemove", S), 
o.on("mousedown", z), e.on("mouseup", I), e.on("touchmove", S), 
o.on("touchstart", z), e.on("touchend", I), this.destroy = function () { 
e.off("mousemove", S), o.off("mousedown", z), e.off("mouseup", S), 
e.off("touchmove", S), o.off("touchstart", z), e.off("touchend", S), 
o.remove() } } }]), e.factory("cropPubSub", [function () { return function 
() { var e = {}; this.on = function (t, i) { return t.split(" 
").forEach(function (t) { e[t] || (e[t] = []), e[t].push(i) }), this }, 
this.trigger = function (t, i) { return angular.forEach(e[t], function (e) 
{ e.call(null, i) }), this } } }]), e.directive("imgCrop", ["$timeout", 
"cropHost", "cropPubSub", function (e, t, i) { return { restrict: "E", 
scope: { image: "=", resultImage: "=", changeOnFly: "=", areaType: "@", 
areaMinSize: "=", resultImageSize: "=", resultImageFormat: "@", 
resultImageQuality: "=", onChange: "&", onLoadBegin: "&", onLoadDone: "&", 
onLoadError: "&" }, template: "<canvas></canvas>", controller: ["$scope", 
function (e) { e.events = new i }], link: function (i, r) { var s, o = 
i.events, a = new t(r.find("canvas"), {}, o), n = function (e) { var t = 
a.getResultImageDataURI(); s !== t && (s = t, 
angular.isDefined(e.resultImage) && (e.resultImage = t), e.onChange({ 
$dataURI: e.resultImage })) }, h = function (t) { return function () { 
e(function () { i.$apply(function (e) { t(e) }) }) } }; o.on("load-start", 
h(function (e) { e.onLoadBegin({}) })).on("load-done", h(function (e) { 
e.onLoadDone({}) })).on("load-error", h(function (e) { e.onLoadError({}) 
})).on("area-move area-resize", h(function (e) { e.changeOnFly && n(e) 
})).on("area-move-end area-resize-end image-updated", h(function (e) { n(e) 
})), i.$watch("image", function () { a.setNewImageSource(i.image) }), 
i.$watch("areaType", function () { a.setAreaType(i.areaType), n(i) }), 
i.$watch("areaMinSize", function () { a.setAreaMinSize(i.areaMinSize), n(i) 
}), i.$watch("resultImageSize", function () { 
a.setResultImageSize(i.resultImageSize), n(i) }), 
i.$watch("resultImageFormat", function () { 
a.setResultImageFormat(i.resultImageFormat), n(i) }), 
i.$watch("resultImageQuality", function () { 
a.setResultImageQuality(i.resultImageQuality), n(i) }), i.$watch(function 
() { return [r[0].clientWidth, r[0].clientHeight] }, function (e) { 
a.setMaxDimensions(e[0], e[1]), n(i) }, !0), i.$on("$destroy", function () 
{ a.destroy() }) } } }]) }();

>  

-- 
You received this message because you are subscribed to the Google Groups 
"AngularJS" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/angular.
For more options, visit https://groups.google.com/d/optout.

Reply via email to