Solution :
Integrate Croppic to ASP.NET MVC C# , so that user can upload an image and crop, zoom , rotate the image and save to the assigned folder.
Step 1:
Create one empty Project ASP.NET Web Application in Visual Studio 2013
Step 2 :
Download croppic (Image cropping jquery plugin from croppic.net == > Link http://croppic.net/croppic.zip
Please note that I have edited the css files to match the folder structure. Please download the entire solution from github and follow it.
Step 3 :
Extract The croppic Folder inside the scripts folder and make sure the folder structure as shown
Step 4:
Create a controller called Croppic and paste following content.
using Newtonsoft.Json;
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
using System.Web;
using System.Web.Mvc;
//Coding by Haneef puttur
namespace Croppic.Controllers
{
public class CroppicController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public string UploadOriginalImage(HttpPostedFileBase img)
{
string folder = Server.MapPath("~/Temp");
string extension = Path.GetExtension(img.FileName);
string pic = System.IO.Path.GetFileName(Guid.NewGuid().ToString());
var tempPath = Path.ChangeExtension(pic, extension);
string tempFilePath = System.IO.Path.Combine(folder, tempPath);
img.SaveAs(tempFilePath);
var image = System.Drawing.Image.FromFile(tempFilePath);
var result = new
{
status = "success",
width = image.Width,
height = image.Height,
url = "../Temp/" + tempPath
};
return JsonConvert.SerializeObject(result);
}
[HttpPost]
public string CroppedImage(string imgUrl, int imgInitW, int imgInitH, double imgW, double imgH, int imgY1, int imgX1, int cropH, int cropW, int rotation)
{
var originalFilePath = Server.MapPath(imgUrl);
var fileName = CropImage(originalFilePath, imgInitW, imgInitH, (int)imgW, (int)imgH, imgY1, imgX1, cropH, cropW, rotation);
//unlock any pending procss , close any open files and delete temp file
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
if (System.IO.File.Exists(originalFilePath))
{
System.IO.File.Delete(originalFilePath);
}
var result = new
{
status = "success",
url = "../Cropped/" + fileName
};
return JsonConvert.SerializeObject(result);
}
private string CropImage(string originalFilePath, int origW, int origH, int targetW, int targetH, int cropStartY, int cropStartX, int cropH, int cropW, int rotation)
{
var originalImage = Image.FromFile(originalFilePath);
//if rotation is required call rotation function
if (rotation != 0)
{
originalImage = RotateImage(originalImage, rotation);
}
var resizedOriginalImage = new Bitmap(originalImage, targetW, targetH);
var targetImage = new Bitmap(cropW, cropH);
//create brush to fill image background with white color
SolidBrush brush = new SolidBrush(Color.FromArgb(255, 255, 255));
using (Graphics g = Graphics.FromImage(targetImage))
{
//fill bg with white color
g.FillRectangle(brush, 0, 0, cropW, cropH);
g.DrawImage(resizedOriginalImage, new Rectangle(0, 0, cropW, cropH), new Rectangle(cropStartX, cropStartY, cropW, cropH), GraphicsUnit.Pixel);
g.Dispose();
}
// put new name for the file
string newname = System.IO.Path.GetFileName(Guid.NewGuid().ToString());
// change the extesion of file to jpg
string ext = ".jpg";
//build the file name
string fileName = Path.ChangeExtension(newname, ext);
//move the file to cropped folder
var folder = Server.MapPath("~/Cropped");
string croppedPath = Path.Combine(folder, fileName);
//save image and force to format conversion to jpg
targetImage.Save(croppedPath, System.Drawing.Imaging.ImageFormat.Jpeg);
targetImage.Dispose();
originalImage.Dispose();
return fileName;
}
public static Bitmap RotateImage(Image img, float rotationAngle)
{
Bitmap bmp = new Bitmap(img.Width, img.Height);
Graphics gfx = Graphics.FromImage(bmp);
gfx.TranslateTransform((float)bmp.Width / 2, (float)bmp.Height / 2);
gfx.RotateTransform(rotationAngle);
gfx.TranslateTransform(-(float)bmp.Width / 2, -(float)bmp.Height / 2);
gfx.InterpolationMode = InterpolationMode.HighQualityBicubic;
gfx.DrawImage(img, new Point(0, 0));
gfx.Dispose();
return bmp;
}
}
}
Step 5
Now Create a Index View under Croppic Folder and paste following content
@{
ViewBag.Title = "Index";
}
<link href="~/Scripts/Croppic/croppic.css" rel="stylesheet" />
<script src="~/Scripts/Croppic/croppic.js"></script>
<div class="container">
<div class="row">
<div class="col-lg-6">
<div id="croppic" style="width: 400px; height: 513px; overflow: hidden"></div>
@*<div id="croppic"></div>*@
<span class="btn" id="cropContainerHeaderButton">Click to Upload Your Picture</span>
</div>
</div>
</div>
<script type="text/javascript">
var croppicContaineroutputMinimal = {
uploadUrl: '/Croppic/UploadOriginalImage',
cropUrl: '/Croppic/CroppedImage',
customUploadButtonId: 'cropContainerHeaderButton',
modal: true,
doubleZoomControls: false,
rotateControls: true,
loaderHtml: '<div class="loader bubblingG"><span id="bubblingG_1"></span><span id="bubblingG_2"></span><span id="bubblingG_3"></span></div> '
}
var cropContaineroutput = new Croppic('croppic', croppicContaineroutputMinimal);
</script>
Step 6
Now in Shared View Folder , Edit the bundle lines of -Layout.cshtml so that jquery is initiated at the beginning of the page as below
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@ViewBag.Title - My ASP.NET Application</title>
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/bootstrap")
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
@Html.ActionLink("Application name", "Index", "Home", null, new { @class = "navbar-brand" })
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
</ul>
@Html.Partial("_LoginPartial")
</div>
</div>
</div>
<div class="container body-content">
@RenderBody()
<hr />
<footer>
<p>© @DateTime.Now.Year - My ASP.NET Application</p>
</footer>
</div>
@RenderSection("scripts", required: false)
</body>
</html>
Create Two Folders in the root
1 : Cropped (to Store cropped images)
2: Temp (To store temp images)
Now Run the application and browse to Croppic Controller

If you wish to change the crop size please hcnage in 2 places:
- Croppic / Index.cshtml as below
Also change the dimension in Scripts => Croppic => Croppic.css
For complete source code of the project please refer : https://github.com/haneefputtur/ASP_NET_CROPPIC
You can also download the complete solution at : https://github.com/haneefputtur/ASP_NET_CROPPIC/archive/master.zip





