Pages

Friday 16 November 2012

Image cropping using jquery

jcrop.css
.jcrop-holder
{
       text-align: left;
}

.jcrop-vline, .jcrop-hline
{
       font-size: 0;
       position: absolute;
       background: white url('../images/Jcrop.gif') top left repeat;
       /*
       opacity: .5;
       *filter:alpha(opacity=50);
       */
}
.jcrop-vline { height: 100%; width: 1px !important; }
.jcrop-hline { width: 100%; height: 1px !important; }
.jcrop-handle {
       font-size: 1px;
       width: 7px !important;
       height: 7px !important;
       border: 1px #eee solid;
       background-color: #333;
       *width: 9px;
       *height: 9px;
}

.jcrop-tracker {
       *background-color: gray;
       width: 100%; height: 100%;
}

.custom .jcrop-vline,
.custom .jcrop-hline
{
       background: yellow;
}
.custom .jcrop-handle
{
       border-color: black;
       background-color: #C7BB00;
       -moz-border-radius: 3px;
       -webkit-border-radius: 3px;
}
.coor
{
    width:30px;
}
crop.js
function Init() {
    $(function() {
    $('#originalImage').Jcrop({
            onChange: showCoords,
            onSelect: showCoords
        });
    });
    // Patch for IE to force "overflow: auto;"
    document.getElementById("imgContainer").style["position"] = "relative";
}

function showCoords(c) {
    $('#x1').val(c.x);
    $('#y1').val(c.y);
    $('#x2').val(c.x2);
    $('#y2').val(c.y2);
    $('#w').val(c.w);
    $('#h').val(c.h);
};

function ValidateSelected() {
    if (document.getElementById("w").value == "" || document.getElementById("w").value == "0"
        || document.getElementById("h").value == "" || document.getElementById("h").value == "0") {
        alert("No area to crop was selected");
        return false;
    }
}
jcrop.js
/**
 * jquery.Jcrop.js v0.9.8
 * jQuery Image Cropping Plugin
 * @author Kelly Hallman <khallman@gmail.com>
 * Copyright (c) 2008-2009 Kelly Hallman - released under MIT License {{{
 *
 * Permission is hereby granted, free of charge, to any person
 * obtaining a copy of this software and associated documentation
 * files (the "Software"), to deal in the Software without
 * restriction, including without limitation the rights to use,
 * copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following
 * conditions:

 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.

 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
 * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.

 * }}}
 */

(function($) {

$.Jcrop = function(obj,opt)
{
       // Initialization {{{

       // Sanitize some options {{{
       var obj = obj, opt = opt;

       if (typeof(obj) !== 'object') obj = $(obj)[0];
       if (typeof(opt) !== 'object') opt = { };

       // Some on-the-fly fixes for MSIE...sigh
       if (!('trackDocument' in opt))
       {
              opt.trackDocument = $.browser.msie ? false : true;
              if ($.browser.msie && $.browser.version.split('.')[0] == '8')
                     opt.trackDocument = true;
       }

       if (!('keySupport' in opt))
                     opt.keySupport = $.browser.msie ? false : true;
             
       // }}}
       // Extend the default options {{{
       var defaults = {

              // Basic Settings
              trackDocument:             false,
              baseClass:                 'jcrop',
              addClass:                  null,

              // Styling Options
              bgColor:                   'black',
              bgOpacity:                 .6,
              borderOpacity:             .4,
              handleOpacity:             .5,

              handlePad:                 5,
              handleSize:                9,
              handleOffset:        5,
              edgeMargin:                14,

              aspectRatio:         0,
              keySupport:                true,
              cornerHandles:             true,
              sideHandles:         true,
              drawBorders:         true,
              dragEdges:                 true,

              boxWidth:                  0,
              boxHeight:                 0,

              boundary:                  8,
              animationDelay:            20,
              swingSpeed:                3,

              allowSelect:         true,
              allowMove:                 true,
              allowResize:         true,

              minSelect:                 [ 0, 0 ],
              maxSize:                   [ 0, 0 ],
              minSize:                   [ 0, 0 ],

              // Callbacks / Event Handlers
              onChange: function() { },
              onSelect: function() { }

       };
       var options = defaults;
       setOptions(opt);

       // }}}
       // Initialize some jQuery objects {{{

       var $origimg = $(obj);
       var $img = $origimg.clone().removeAttr('id').css({ position: 'absolute' });

       $img.width($origimg.width());
       $img.height($origimg.height());
       $origimg.after($img).hide();

       presize($img,options.boxWidth,options.boxHeight);

       var boundx = $img.width(),
              boundy = $img.height(),

              $div = $('<div />')
                     .width(boundx).height(boundy)
                     .addClass(cssClass('holder'))
                     .css({
                           position: 'relative',
                           backgroundColor: options.bgColor
                     }).insertAfter($origimg).append($img);
       ;
      
       if (options.addClass) $div.addClass(options.addClass);
       //$img.wrap($div);

       var $img2 = $('<img />')/*{{{*/
                     .attr('src',$img.attr('src'))
                     .css('position','absolute')
                     .width(boundx).height(boundy)
       ;/*}}}*/
       var $img_holder = $('<div />')/*{{{*/
              .width(pct(100)).height(pct(100))
              .css({
                     zIndex: 310,
                     position: 'absolute',
                     overflow: 'hidden'
              })
              .append($img2)
       ;/*}}}*/
       var $hdl_holder = $('<div />')/*{{{*/
              .width(pct(100)).height(pct(100))
              .css('zIndex',320);
       /*}}}*/
       var $sel = $('<div />')/*{{{*/
              .css({
                     position: 'absolute',
                     zIndex: 300
              })
              .insertBefore($img)
              .append($img_holder,$hdl_holder)
       ;/*}}}*/

       var bound = options.boundary;
       var $trk = newTracker().width(boundx+(bound*2)).height(boundy+(bound*2))
              .css({ position: 'absolute', top: px(-bound), left: px(-bound), zIndex: 290 })
              .mousedown(newSelection); 
      
       /* }}} */
       // Set more variables {{{

       var xlimit, ylimit, xmin, ymin;
       var xscale, yscale, enabled = true;
       var docOffset = getPos($img),
              // Internal states
              btndown, lastcurs, dimmed, animating,
              shift_down;

       // }}}
             

              // }}}
       // Internal Modules {{{

       var Coords = function()/*{{{*/
       {
              var x1 = 0, y1 = 0, x2 = 0, y2 = 0, ox, oy;

              function setPressed(pos)/*{{{*/
              {
                     var pos = rebound(pos);
                     x2 = x1 = pos[0];
                     y2 = y1 = pos[1];
              };
              /*}}}*/
              function setCurrent(pos)/*{{{*/
              {
                     var pos = rebound(pos);
                     ox = pos[0] - x2;
                     oy = pos[1] - y2;
                     x2 = pos[0];
                     y2 = pos[1];
              };
              /*}}}*/
              function getOffset()/*{{{*/
              {
                     return [ ox, oy ];
              };
              /*}}}*/
              function moveOffset(offset)/*{{{*/
              {
                     var ox = offset[0], oy = offset[1];

                     if (0 > x1 + ox) ox -= ox + x1;
                     if (0 > y1 + oy) oy -= oy + y1;

                     if (boundy < y2 + oy) oy += boundy - (y2 + oy);
                     if (boundx < x2 + ox) ox += boundx - (x2 + ox);

                     x1 += ox;
                     x2 += ox;
                     y1 += oy;
                     y2 += oy;
              };
              /*}}}*/
              function getCorner(ord)/*{{{*/
              {
                     var c = getFixed();
                     switch(ord)
                     {
                           case 'ne': return [ c.x2, c.y ];
                           case 'nw': return [ c.x, c.y ];
                           case 'se': return [ c.x2, c.y2 ];
                           case 'sw': return [ c.x, c.y2 ];
                     }
              };
              /*}}}*/
              function getFixed()/*{{{*/
              {
                     if (!options.aspectRatio) return getRect();
                     // This function could use some optimization I think...
                     var aspect = options.aspectRatio,
                           min_x = options.minSize[0]/xscale,
                           min_y = options.minSize[1]/yscale,
                           max_x = options.maxSize[0]/xscale,
                           max_y = options.maxSize[1]/yscale,
                           rw = x2 - x1,
                           rh = y2 - y1,
                           rwa = Math.abs(rw),
                           rha = Math.abs(rh),
                           real_ratio = rwa / rha,
                           xx, yy
                     ;
                     if (max_x == 0) { max_x = boundx * 10 }
                     if (max_y == 0) { max_y = boundy * 10 }
                     if (real_ratio < aspect)
                     {
                           yy = y2;
                           w = rha * aspect;
                           xx = rw < 0 ? x1 - w : w + x1;

                           if (xx < 0)
                           {
                                  xx = 0;
                                  h = Math.abs((xx - x1) / aspect);
                                  yy = rh < 0 ? y1 - h: h + y1;
                           }
                           else if (xx > boundx)
                           {
                                  xx = boundx;
                                  h = Math.abs((xx - x1) / aspect);
                                  yy = rh < 0 ? y1 - h : h + y1;
                           }
                     }
                     else
                     {
                           xx = x2;
                           h = rwa / aspect;
                           yy = rh < 0 ? y1 - h : y1 + h;
                           if (yy < 0)
                           {
                                  yy = 0;
                                  w = Math.abs((yy - y1) * aspect);
                                  xx = rw < 0 ? x1 - w : w + x1;
                           }
                           else if (yy > boundy)
                           {
                                  yy = boundy;
                                  w = Math.abs(yy - y1) * aspect;
                                  xx = rw < 0 ? x1 - w : w + x1;
                           }
                     }

                     // Magic %-)
                     if(xx > x1) { // right side
                       if(xx - x1 < min_x) {
                           xx = x1 + min_x;
                       } else if (xx - x1 > max_x) {
                           xx = x1 + max_x;
                       }
                       if(yy > y1) {
                           yy = y1 + (xx - x1)/aspect;
                       } else {
                           yy = y1 - (xx - x1)/aspect;
                       }
                     } else if (xx < x1) { // left side
                       if(x1 - xx < min_x) {
                            xx = x1 - min_x
                       } else if (x1 - xx > max_x) {
                           xx = x1 - max_x;
                       }
                       if(yy > y1) {
                           yy = y1 + (x1 - xx)/aspect;
                       } else {
                           yy = y1 - (x1 - xx)/aspect;
                       }
                     }

                     if(xx < 0) {
                           x1 -= xx;
                           xx = 0;
                     } else  if (xx > boundx) {
                           x1 -= xx - boundx;
                           xx = boundx;
                     }

                     if(yy < 0) {
                           y1 -= yy;
                           yy = 0;
                     } else  if (yy > boundy) {
                           y1 -= yy - boundy;
                           yy = boundy;
                     }

                     return last = makeObj(flipCoords(x1,y1,xx,yy));
              };
              /*}}}*/
              function rebound(p)/*{{{*/
              {
                     if (p[0] < 0) p[0] = 0;
                     if (p[1] < 0) p[1] = 0;

                     if (p[0] > boundx) p[0] = boundx;
                     if (p[1] > boundy) p[1] = boundy;

                     return [ p[0], p[1] ];
              };
              /*}}}*/
              function flipCoords(x1,y1,x2,y2)/*{{{*/
              {
                     var xa = x1, xb = x2, ya = y1, yb = y2;
                     if (x2 < x1)
                     {
                           xa = x2;
                           xb = x1;
                     }
                     if (y2 < y1)
                     {
                           ya = y2;
                           yb = y1;
                     }
                     return [ Math.round(xa), Math.round(ya), Math.round(xb), Math.round(yb) ];
              };
              /*}}}*/
              function getRect()/*{{{*/
              {
                     var xsize = x2 - x1;
                     var ysize = y2 - y1;

                     if (xlimit && (Math.abs(xsize) > xlimit))
                           x2 = (xsize > 0) ? (x1 + xlimit) : (x1 - xlimit);
                     if (ylimit && (Math.abs(ysize) > ylimit))
                           y2 = (ysize > 0) ? (y1 + ylimit) : (y1 - ylimit);

                     if (ymin && (Math.abs(ysize) < ymin))
                           y2 = (ysize > 0) ? (y1 + ymin) : (y1 - ymin);
                     if (xmin && (Math.abs(xsize) < xmin))
                           x2 = (xsize > 0) ? (x1 + xmin) : (x1 - xmin);

                     if (x1 < 0) { x2 -= x1; x1 -= x1; }
                     if (y1 < 0) { y2 -= y1; y1 -= y1; }
                     if (x2 < 0) { x1 -= x2; x2 -= x2; }
                     if (y2 < 0) { y1 -= y2; y2 -= y2; }
                     if (x2 > boundx) { var delta = x2 - boundx; x1 -= delta; x2 -= delta; }
                     if (y2 > boundy) { var delta = y2 - boundy; y1 -= delta; y2 -= delta; }
                     if (x1 > boundx) { var delta = x1 - boundy; y2 -= delta; y1 -= delta; }
                     if (y1 > boundy) { var delta = y1 - boundy; y2 -= delta; y1 -= delta; }

                     return makeObj(flipCoords(x1,y1,x2,y2));
              };
              /*}}}*/
              function makeObj(a)/*{{{*/
              {
                     return { x: a[0], y: a[1], x2: a[2], y2: a[3],
                           w: a[2] - a[0], h: a[3] - a[1] };
              };
              /*}}}*/

              return {
                     flipCoords: flipCoords,
                     setPressed: setPressed,
                     setCurrent: setCurrent,
                     getOffset: getOffset,
                     moveOffset: moveOffset,
                     getCorner: getCorner,
                     getFixed: getFixed
              };
       }();

       /*}}}*/
       var Selection = function()/*{{{*/
       {
              var start, end, dragmode, awake, hdep = 370;
              var borders = { };
              var handle = { };
              var seehandles = false;
              var hhs = options.handleOffset;

              /* Insert draggable elements {{{*/

              // Insert border divs for outline
              if (options.drawBorders) {
                     borders = {
                                  top: insertBorder('hline')
                                         .css('top',$.browser.msie?px(-1):px(0)),
                                  bottom: insertBorder('hline'),
                                  left: insertBorder('vline'),
                                  right: insertBorder('vline')
                     };
              }

              // Insert handles on edges
              if (options.dragEdges) {
                     handle.t = insertDragbar('n');
                     handle.b = insertDragbar('s');
                     handle.r = insertDragbar('e');
                     handle.l = insertDragbar('w');
              }

              // Insert side handles
              options.sideHandles &&
                     createHandles(['n','s','e','w']);

              // Insert corner handles
              options.cornerHandles &&
                     createHandles(['sw','nw','ne','se']);

              /*}}}*/
              // Private Methods
              function insertBorder(type)/*{{{*/
              {
                     var jq = $('<div />')
                           .css({position: 'absolute', opacity: options.borderOpacity })
                           .addClass(cssClass(type));
                     $img_holder.append(jq);
                     return jq;
              };
              /*}}}*/
              function dragDiv(ord,zi)/*{{{*/
              {
                     var jq = $('<div />')
                           .mousedown(createDragger(ord))
                           .css({
                                  cursor: ord+'-resize',
                                  position: 'absolute',
                                  zIndex: zi
                           })
                     ;
                     $hdl_holder.append(jq);
                     return jq;
              };
              /*}}}*/
              function insertHandle(ord)/*{{{*/
              {
                     return dragDiv(ord,hdep++)
                           .css({ top: px(-hhs+1), left: px(-hhs+1), opacity: options.handleOpacity })
                           .addClass(cssClass('handle'));
              };
              /*}}}*/
              function insertDragbar(ord)/*{{{*/
              {
                     var s = options.handleSize,
                           o = hhs,
                           h = s, w = s,
                           t = o, l = o;

                     switch(ord)
                     {
                           case 'n': case 's': w = pct(100); break;
                           case 'e': case 'w': h = pct(100); break;
                     }

                     return dragDiv(ord,hdep++).width(w).height(h)
                           .css({ top: px(-t+1), left: px(-l+1)});
              };
              /*}}}*/
              function createHandles(li)/*{{{*/
              {
                     for(i in li) handle[li[i]] = insertHandle(li[i]);
              };
              /*}}}*/
              function moveHandles(c)/*{{{*/
              {
                     var midvert  = Math.round((c.h / 2) - hhs),
                           midhoriz = Math.round((c.w / 2) - hhs),
                           north = west = -hhs+1,
                           east = c.w - hhs,
                           south = c.h - hhs,
                           x, y;

                     'e' in handle &&
                           handle.e.css({ top: px(midvert), left: px(east) }) &&
                           handle.w.css({ top: px(midvert) }) &&
                           handle.s.css({ top: px(south), left: px(midhoriz) }) &&
                           handle.n.css({ left: px(midhoriz) });

                     'ne' in handle &&
                           handle.ne.css({ left: px(east) }) &&
                           handle.se.css({ top: px(south), left: px(east) }) &&
                           handle.sw.css({ top: px(south) });

                     'b' in handle &&
                           handle.b.css({ top: px(south) }) &&
                           handle.r.css({ left: px(east) });
              };
              /*}}}*/
              function moveto(x,y)/*{{{*/
              {
                     $img2.css({ top: px(-y), left: px(-x) });
                     $sel.css({ top: px(y), left: px(x) });
              };
              /*}}}*/
              function resize(w,h)/*{{{*/
              {
                     $sel.width(w).height(h);
              };
              /*}}}*/
              function refresh()/*{{{*/
              {
                     var c = Coords.getFixed();

                     Coords.setPressed([c.x,c.y]);
                     Coords.setCurrent([c.x2,c.y2]);

                     updateVisible();
              };
              /*}}}*/

              // Internal Methods
              function updateVisible()/*{{{*/
                     { if (awake) return update(); };
              /*}}}*/
              function update()/*{{{*/
              {
                     var c = Coords.getFixed();

                     resize(c.w,c.h);
                     moveto(c.x,c.y);

                     options.drawBorders &&
                           borders['right'].css({ left: px(c.w-1) }) &&
                                  borders['bottom'].css({ top: px(c.h-1) });

                     seehandles && moveHandles(c);
                     awake || show();

                     options.onChange(unscale(c));
              };
              /*}}}*/
              function show()/*{{{*/
              {
                     $sel.show();
                     $img.css('opacity',options.bgOpacity);
                     awake = true;
              };
              /*}}}*/
              function release()/*{{{*/
              {
                     disableHandles();
                     $sel.hide();
                     $img.css('opacity',1);
                     awake = false;
              };
              /*}}}*/
              function showHandles()//{{{
              {
                     if (seehandles)
                     {
                           moveHandles(Coords.getFixed());
                           $hdl_holder.show();
                     }
              };
              //}}}
              function enableHandles()/*{{{*/
              {
                     seehandles = true;
                     if (options.allowResize)
                     {
                           moveHandles(Coords.getFixed());
                           $hdl_holder.show();
                           return true;
                     }
              };
              /*}}}*/
              function disableHandles()/*{{{*/
              {
                     seehandles = false;
                     $hdl_holder.hide();
              };
              /*}}}*/
              function animMode(v)/*{{{*/
              {
                     (animating = v) ? disableHandles(): enableHandles();
              };
              /*}}}*/
              function done()/*{{{*/
              {
                     animMode(false);
                     refresh();
              };
              /*}}}*/

              var $track = newTracker().mousedown(createDragger('move'))
                           .css({ cursor: 'move', position: 'absolute', zIndex: 360 })

              $img_holder.append($track);
              disableHandles();

              return {
                     updateVisible: updateVisible,
                     update: update,
                     release: release,
                     refresh: refresh,
                     setCursor: function (cursor) { $track.css('cursor',cursor); },
                     enableHandles: enableHandles,
                     enableOnly: function() { seehandles = true; },
                     showHandles: showHandles,
                     disableHandles: disableHandles,
                     animMode: animMode,
                     done: done
              };
       }();
       /*}}}*/
       var Tracker = function()/*{{{*/
       {
              var onMove           = function() { },
                     onDone        = function() { },
                     trackDoc      = options.trackDocument;

              if (!trackDoc)
              {
                     $trk
                           .mousemove(trackMove)
                           .mouseup(trackUp)
                           .mouseout(trackUp)
                     ;
              }

              function toFront()/*{{{*/
              {
                     $trk.css({zIndex:450});
                     if (trackDoc)
                     {
                           $(document)
                                  .mousemove(trackMove)
                                  .mouseup(trackUp)
                           ;
                     }
              }
              /*}}}*/
              function toBack()/*{{{*/
              {
                     $trk.css({zIndex:290});
                     if (trackDoc)
                     {
                           $(document)
                                  .unbind('mousemove',trackMove)
                                  .unbind('mouseup',trackUp)
                           ;
                     }
              }
              /*}}}*/
              function trackMove(e)/*{{{*/
              {
                     onMove(mouseAbs(e));
              };
              /*}}}*/
              function trackUp(e)/*{{{*/
              {
                     e.preventDefault();
                     e.stopPropagation();

                     if (btndown)
                     {
                           btndown = false;

                           onDone(mouseAbs(e));
                           options.onSelect(unscale(Coords.getFixed()));
                           toBack();
                           onMove = function() { };
                           onDone = function() { };
                     }

                     return false;
              };
              /*}}}*/

              function activateHandlers(move,done)/* {{{ */
              {
                     btndown = true;
                     onMove = move;
                     onDone = done;
                     toFront();
                     return false;
              };
              /* }}} */

              function setCursor(t) { $trk.css('cursor',t); };

              $img.before($trk);
              return {
                     activateHandlers: activateHandlers,
                     setCursor: setCursor
              };
       }();
       /*}}}*/
       var KeyManager = function()/*{{{*/
       {
              var $keymgr = $('<input type="radio" />')
                           .css({ position: 'absolute', left: '-30px' })
                           .keypress(parseKey)
                           .blur(onBlur),

                     $keywrap = $('<div />')
                           .css({
                                  position: 'absolute',
                                  overflow: 'hidden'
                           })
                           .append($keymgr)
              ;

              function watchKeys()/*{{{*/
              {
                     if (options.keySupport)
                     {
                           $keymgr.show();
                           $keymgr.focus();
                     }
              };
              /*}}}*/
              function onBlur(e)/*{{{*/
              {
                     $keymgr.hide();
              };
              /*}}}*/
              function doNudge(e,x,y)/*{{{*/
              {
                     if (options.allowMove) {
                           Coords.moveOffset([x,y]);
                           Selection.updateVisible();
                     };
                     e.preventDefault();
                     e.stopPropagation();
              };
              /*}}}*/
              function parseKey(e)/*{{{*/
              {
                     if (e.ctrlKey) return true;
                     shift_down = e.shiftKey ? true : false;
                     var nudge = shift_down ? 10 : 1;
                     switch(e.keyCode)
                     {
                           case 37: doNudge(e,-nudge,0); break;
                           case 39: doNudge(e,nudge,0); break;
                           case 38: doNudge(e,0,-nudge); break;
                           case 40: doNudge(e,0,nudge); break;

                           case 27: Selection.release(); break;

                           case 9: return true;
                     }

                     return nothing(e);
              };
              /*}}}*/
             
              if (options.keySupport) $keywrap.insertBefore($img);
              return {
                     watchKeys: watchKeys
              };
       }();
       /*}}}*/

       // }}}
       // Internal Methods {{{

       function px(n) { return '' + parseInt(n) + 'px'; };
       function pct(n) { return '' + parseInt(n) + '%'; };
       function cssClass(cl) { return options.baseClass + '-' + cl; };
       function getPos(obj)/*{{{*/
       {
              // Updated in v0.9.4 to use built-in dimensions plugin
              var pos = $(obj).offset();
              return [ pos.left, pos.top ];
       };
       /*}}}*/
       function mouseAbs(e)/*{{{*/
       {
              return [ (e.pageX - docOffset[0]), (e.pageY - docOffset[1]) ];
       };
       /*}}}*/
       function myCursor(type)/*{{{*/
       {
              if (type != lastcurs)
              {
                     Tracker.setCursor(type);
                     //Handles.xsetCursor(type);
                     lastcurs = type;
              }
       };
       /*}}}*/
       function startDragMode(mode,pos)/*{{{*/
       {
              docOffset = getPos($img);
              Tracker.setCursor(mode=='move'?mode:mode+'-resize');

              if (mode == 'move')
                     return Tracker.activateHandlers(createMover(pos), doneSelect);

              var fc = Coords.getFixed();
              var opp = oppLockCorner(mode);
              var opc = Coords.getCorner(oppLockCorner(opp));

              Coords.setPressed(Coords.getCorner(opp));
              Coords.setCurrent(opc);

              Tracker.activateHandlers(dragmodeHandler(mode,fc),doneSelect);
       };
       /*}}}*/
       function dragmodeHandler(mode,f)/*{{{*/
       {
              return function(pos) {
                     if (!options.aspectRatio) switch(mode)
                     {
                           case 'e': pos[1] = f.y2; break;
                           case 'w': pos[1] = f.y2; break;
                           case 'n': pos[0] = f.x2; break;
                           case 's': pos[0] = f.x2; break;
                     }
                     else switch(mode)
                     {
                           case 'e': pos[1] = f.y+1; break;
                           case 'w': pos[1] = f.y+1; break;
                           case 'n': pos[0] = f.x+1; break;
                           case 's': pos[0] = f.x+1; break;
                     }
                     Coords.setCurrent(pos);
                     Selection.update();
              };
       };
       /*}}}*/
       function createMover(pos)/*{{{*/
       {
              var lloc = pos;
              KeyManager.watchKeys();

              return function(pos)
              {
                     Coords.moveOffset([pos[0] - lloc[0], pos[1] - lloc[1]]);
                     lloc = pos;
                    
                     Selection.update();
              };
       };
       /*}}}*/
       function oppLockCorner(ord)/*{{{*/
       {
              switch(ord)
              {
                     case 'n': return 'sw';
                     case 's': return 'nw';
                     case 'e': return 'nw';
                     case 'w': return 'ne';
                     case 'ne': return 'sw';
                     case 'nw': return 'se';
                     case 'se': return 'nw';
                     case 'sw': return 'ne';
              };
       };
       /*}}}*/
       function createDragger(ord)/*{{{*/
       {
              return function(e) {
                     if (options.disabled) return false;
                     if ((ord == 'move') && !options.allowMove) return false;
                     btndown = true;
                     startDragMode(ord,mouseAbs(e));
                     e.stopPropagation();
                     e.preventDefault();
                     return false;
              };
       };
       /*}}}*/
       function presize($obj,w,h)/*{{{*/
       {
              var nw = $obj.width(), nh = $obj.height();
              if ((nw > w) && w > 0)
              {
                     nw = w;
                     nh = (w/$obj.width()) * $obj.height();
              }
              if ((nh > h) && h > 0)
              {
                     nh = h;
                     nw = (h/$obj.height()) * $obj.width();
              }
              xscale = $obj.width() / nw;
              yscale = $obj.height() / nh;
              $obj.width(nw).height(nh);
       };
       /*}}}*/
       function unscale(c)/*{{{*/
       {
              return {
                     x: parseInt(c.x * xscale), y: parseInt(c.y * yscale),
                     x2: parseInt(c.x2 * xscale), y2: parseInt(c.y2 * yscale),
                     w: parseInt(c.w * xscale), h: parseInt(c.h * yscale)
              };
       };
       /*}}}*/
       function doneSelect(pos)/*{{{*/
       {
              var c = Coords.getFixed();
              if (c.w > options.minSelect[0] && c.h > options.minSelect[1])
              {
                     Selection.enableHandles();
                     Selection.done();
              }
              else
              {
                     Selection.release();
              }
              Tracker.setCursor( options.allowSelect?'crosshair':'default' );
       };
       /*}}}*/
       function newSelection(e)/*{{{*/
       {
              if (options.disabled) return false;
              if (!options.allowSelect) return false;
              btndown = true;
              docOffset = getPos($img);
              Selection.disableHandles();
              myCursor('crosshair');
              var pos = mouseAbs(e);
              Coords.setPressed(pos);
              Tracker.activateHandlers(selectDrag,doneSelect);
              KeyManager.watchKeys();
              Selection.update();

              e.stopPropagation();
              e.preventDefault();
              return false;
       };
       /*}}}*/
       function selectDrag(pos)/*{{{*/
       {
              Coords.setCurrent(pos);
              Selection.update();
       };
       /*}}}*/
       function newTracker()
       {
              var trk = $('<div></div>').addClass(cssClass('tracker'));
              $.browser.msie && trk.css({ opacity: 0, backgroundColor: 'white' });
              return trk;
       };

       // }}}
       // API methods {{{
             
       function animateTo(a)/*{{{*/
       {
              var x1 = a[0] / xscale,
                     y1 = a[1] / yscale,
                     x2 = a[2] / xscale,
                     y2 = a[3] / yscale;

              if (animating) return;

              var animto = Coords.flipCoords(x1,y1,x2,y2);
              var c = Coords.getFixed();
              var animat = initcr = [ c.x, c.y, c.x2, c.y2 ];
              var interv = options.animationDelay;

              var x = animat[0];
              var y = animat[1];
              var x2 = animat[2];
              var y2 = animat[3];
              var ix1 = animto[0] - initcr[0];
              var iy1 = animto[1] - initcr[1];
              var ix2 = animto[2] - initcr[2];
              var iy2 = animto[3] - initcr[3];
              var pcent = 0;
              var velocity = options.swingSpeed;

              Selection.animMode(true);

              var animator = function()
              {
                     return function()
                     {
                           pcent += (100 - pcent) / velocity;

                           animat[0] = x + ((pcent / 100) * ix1);
                           animat[1] = y + ((pcent / 100) * iy1);
                           animat[2] = x2 + ((pcent / 100) * ix2);
                           animat[3] = y2 + ((pcent / 100) * iy2);

                           if (pcent < 100) animateStart();
                                  else Selection.done();

                           if (pcent >= 99.8) pcent = 100;

                           setSelectRaw(animat);
                     };
              }();

              function animateStart()
                     { window.setTimeout(animator,interv); };

              animateStart();
       };
       /*}}}*/
       function setSelect(rect)//{{{
       {
              setSelectRaw([rect[0]/xscale,rect[1]/yscale,rect[2]/xscale,rect[3]/yscale]);
       };
       //}}}
       function setSelectRaw(l) /*{{{*/
       {
              Coords.setPressed([l[0],l[1]]);
              Coords.setCurrent([l[2],l[3]]);
              Selection.update();
       };
       /*}}}*/
       function setOptions(opt)/*{{{*/
       {
              if (typeof(opt) != 'object') opt = { };
              options = $.extend(options,opt);

              if (typeof(options.onChange)!=='function')
                     options.onChange = function() { };

              if (typeof(options.onSelect)!=='function')
                     options.onSelect = function() { };

       };
       /*}}}*/
       function tellSelect()/*{{{*/
       {
              return unscale(Coords.getFixed());
       };
       /*}}}*/
       function tellScaled()/*{{{*/
       {
              return Coords.getFixed();
       };
       /*}}}*/
       function setOptionsNew(opt)/*{{{*/
       {
              setOptions(opt);
              interfaceUpdate();
       };
       /*}}}*/
       function disableCrop()//{{{
       {
              options.disabled = true;
              Selection.disableHandles();
              Selection.setCursor('default');
              Tracker.setCursor('default');
       };
       //}}}
       function enableCrop()//{{{
       {
              options.disabled = false;
              interfaceUpdate();
       };
       //}}}
       function cancelCrop()//{{{
       {
              Selection.done();
              Tracker.activateHandlers(null,null);
       };
       //}}}
       function destroy()//{{{
       {
              $div.remove();
              $origimg.show();
       };
       //}}}

       function interfaceUpdate(alt)//{{{
       // This method tweaks the interface based on options object.
       // Called when options are changed and at end of initialization.
       {
              options.allowResize ?
                     alt?Selection.enableOnly():Selection.enableHandles():
                     Selection.disableHandles();

              Tracker.setCursor( options.allowSelect? 'crosshair': 'default' );
              Selection.setCursor( options.allowMove? 'move': 'default' );

              $div.css('backgroundColor',options.bgColor);

              if ('setSelect' in options) {
                     setSelect(opt.setSelect);
                     Selection.done();
                     delete(options.setSelect);
              }

              if ('trueSize' in options) {
                     xscale = options.trueSize[0] / boundx;
                     yscale = options.trueSize[1] / boundy;
              }

              xlimit = options.maxSize[0] || 0;
              ylimit = options.maxSize[1] || 0;
              xmin = options.minSize[0] || 0;
              ymin = options.minSize[1] || 0;

              if ('outerImage' in options)
              {
                     $img.attr('src',options.outerImage);
                     delete(options.outerImage);
              }

              Selection.refresh();
       };
       //}}}

       // }}}

       $hdl_holder.hide();
       interfaceUpdate(true);
      
       var api = {
              animateTo: animateTo,
              setSelect: setSelect,
              setOptions: setOptionsNew,
              tellSelect: tellSelect,
              tellScaled: tellScaled,

              disable: disableCrop,
              enable: enableCrop,
              cancel: cancelCrop,

              focus: KeyManager.watchKeys,

              getBounds: function() { return [ boundx * xscale, boundy * yscale ]; },
              getWidgetSize: function() { return [ boundx, boundy ]; },

              release: Selection.release,
              destroy: destroy

       };

       $origimg.data('Jcrop',api);
       return api;
};

$.fn.Jcrop = function(options)/*{{{*/
{
       function attachWhenDone(from)/*{{{*/
       {
              var loadsrc = options.useImg || from.src;
              var img = new Image();
              img.onload = function() { $.Jcrop(from,options); };
              img.src = loadsrc;
       };
       /*}}}*/
       if (typeof(options) !== 'object') options = { };

       // Iterate over each object, attach Jcrop
       this.each(function()
       {
              // If we've already attached to this object
              if ($(this).data('Jcrop'))
              {
                     // The API can be requested this way (undocumented)
                     if (options == 'api') return $(this).data('Jcrop');
                     // Otherwise, we just reset the options...
                     else $(this).data('Jcrop').setOptions(options);
              }
              // If we haven't been attached, preload and attach
              else attachWhenDone(this);
       });

       // Return "this" so we're chainable a la jQuery plugin-style!
       return this;
};
/*}}}*/

})(jQuery);

 Default.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Cropping with jquery & ASP.NET - By Miron Abramson</title>
    <link rel="stylesheet" href="style/jcrop.css" type="text/css" />

    <script src="js/jquery.min.js" type="text/javascript"></script>

    <script src="js/jquery.Jcrop.js" type="text/javascript"></script>

    <script src="js/crop.js" type="text/javascript"></script>

</head>
<body onload="Init();">
    <form id="form1" runat="server">
    <table>
        <tr>
            <td>Original image
                <div style="width: 400px; height: 400px; overflow: auto; border: solid 1px black;
                    padding: 10px; margin-bottom: 5px;" id="imgContainer">
                    <img src="images/miautito.jpg" alt="My auto" title="That's my auto :)" id="originalImage" />
                </div>
                <div>
                    X1
                    <input type="text" size="4" id="x1" name="x1" class="coor" readonly="readonly" />
                    Y1
                    <input type="text" size="4" id="y1" name="y1" class="coor" readonly="readonly" />
                    X2
                    <input type="text" size="4" id="x2" name="x2" class="coor" readonly="readonly" />
                    Y2
                    <input type="text" size="4" id="y2" name="y2" class="coor" readonly="readonly" />
                    W
                    <input type="text" size="4" id="w" name="w" class="coor" readonly="readonly" />
                    H
                    <input type="text" size="4" id="h" name="h" class="coor" readonly="readonly" />
                </div>
                <div>
                    <asp:Button runat="server" ID="btnCrop" OnClick="btnCrop_Click" Text="Crop" OnClientClick="return ValidateSelected();" />
                </div>
            </td>
            <td style="vertical-align:top;">
                Cropped image:
                <div style="width: 400px; height: 400px; overflow: auto; border: solid 1px black;
                    padding: 10px; margin-bottom: 5px;">
                    <asp:Literal runat="server" ID="lblCroppedImage"></asp:Literal>
                </div>
            </td>
        </tr>
    </table>
    </form>
</body>
</html>

 Default.aspx.cs
using System;
using System.Web;
using System.Web.UI;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;

public partial class Default : System.Web.UI.Page
{
    protected void btnCrop_Click(object sender, EventArgs e)
    {
        int X1 = Convert.ToInt32(Request.Form["x1"]);
        int Y1 = Convert.ToInt32(Request["y1"]);
        int X2 = Convert.ToInt32(Request.Form["x2"]);
        int Y2 = Convert.ToInt32(Request.Form["y2"]);
        int X = System.Math.Min(X1, X2);
        int Y = System.Math.Min(Y1, Y2);
        int w = Convert.ToInt32(Request.Form["w"]);
        int h = Convert.ToInt32(Request.Form["h"]);

        // That can be any image type (jpg,jpeg,png,gif) from any where in the local server
        string originalFile = Server.MapPath("~/images/miautito.jpg");


        using (Image img = Image.FromFile(originalFile))
        {
            using (System.Drawing.Bitmap _bitmap = new System.Drawing.Bitmap(w, h))
            {
                _bitmap.SetResolution(img.HorizontalResolution, img.VerticalResolution);
                using (Graphics _graphic = Graphics.FromImage(_bitmap))
                {
                    _graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
                    _graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
                    _graphic.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
                    _graphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
                    _graphic.DrawImage(img, 0, 0, w, h);
                    _graphic.DrawImage(img, new Rectangle(0, 0, w, h), X, Y, w, h, GraphicsUnit.Pixel);

                    string extension = Path.GetExtension(originalFile);
                    string croppedFileName = Guid.NewGuid().ToString();
                    string path = Server.MapPath("~/cropped/");


                    // If the image is a gif file, change it into png
                    if (extension.EndsWith("gif", StringComparison.OrdinalIgnoreCase))
                    {
                        extension = ".png";
                    }

                    string newFullPathName = string.Concat(path, croppedFileName, extension);

                    using (EncoderParameters encoderParameters = new EncoderParameters(1))
                    {
                        encoderParameters.Param[0] = new EncoderParameter(Encoder.Quality, 100L);
                        _bitmap.Save(newFullPathName, GetImageCodec(extension), encoderParameters);
                    }

                    lblCroppedImage.Text = string.Format("<img src='cropped/{0}' alt='Cropped image'>", croppedFileName + extension);
                }
            }
        }
    }


    /// <summary>
    /// Find the right codec
    /// </summary>
    /// <param name="extension"></param>
    /// <returns></returns>
    public static ImageCodecInfo GetImageCodec(string extension)
    {
        extension = extension.ToUpperInvariant();
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
        foreach (ImageCodecInfo codec in codecs)
        {
            if (codec.FilenameExtension.Contains(extension))
            {
                return codec;
            }
        }
        return codecs[1];
    }
}




No comments:

Post a Comment

Total Pageviews