The Cropper JS is a lightweight JavaScript library that allows you to crop an image programmatically before upload it to the server. Here I’m going to demonstrate the integration of cropper JS with a basic UI that allows users to select an image from their device, crop and save it. Basically, the cropper.js returned the cropped image in data base64 format that you can transfer to the server and then decode to an image file.
How to Crop Image Before Uploading in JavaScript
First of all, load the Normalize and Cropper CSS by adding the following CDN links into the head tag of your HTML document.
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/normalize/5.0.0/normalize.min.css"> <link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/cropper/2.3.4/cropper.min.css'>
After that, create an HTML input element with the type attribute “file” and define its id “file-input”. Similarly, create a div element for the result and an img tag with a class name “cropped”. The basic HTML structure is as follows:
<main class="page"> <h2>Upload ,Crop and save.</h2> <!-- input file --> <div class="box"> <input type="file" id="file-input"> </div> <!-- leftbox --> <div class="box-2"> <div class="result"></div> </div> <!--rightbox--> <div class="box-2 img-result hide"> <!-- result of crop --> <img class="cropped" src="" alt=""> </div> <!-- input file --> <div class="box"> <div class="options hide"> <label> Width</label> <input type="number" class="img-w" value="300" min="100" max="1200" /> </div> <!-- save btn --> <button class="btn save hide">Save</button> <!-- download btn --> <a href="" class="btn download hide">Download</a> </div> </main>
Now, add the following CSS for the basic layout of the image crop UI. These styles are optional, you can define your own CSS rules according to your needs:
.page { margin: 1em auto; max-width: 768px; display: flex; align-items: flex-start; flex-wrap: wrap; height: 100%; } .box { padding: 0.5em; width: 100%; margin:0.5em; } .box-2 { padding: 0.5em; width: calc(100%/2 - 1em); } .options label, .options input{ width:4em; padding:0.5em 1em; } .btn{ background:white; color:black; border:1px solid black; padding: 0.5em 1em; text-decoration:none; margin:0.8em 0.3em; display:inline-block; cursor:pointer; } .hide { display: none; } img { max-width: 100%; }
Load the Cropper JS by adding the following CDN link before closing the body tag:
<script src='https://cdnjs.cloudflare.com/ajax/libs/cropperjs/0.8.1/cropper.min.js'></script>
Finally, add the following JavaScript function to initialize the cropper functionality:
// vars let result = document.querySelector('.result'), img_result = document.querySelector('.img-result'), img_w = document.querySelector('.img-w'), img_h = document.querySelector('.img-h'), options = document.querySelector('.options'), save = document.querySelector('.save'), cropped = document.querySelector('.cropped'), dwn = document.querySelector('.download'), upload = document.querySelector('#file-input'), cropper = ''; // on change show image with crop options upload.addEventListener('change', e => { if (e.target.files.length) { // start file reader const reader = new FileReader(); reader.onload = e => { if (e.target.result) { // create new image let img = document.createElement('img'); img.id = 'image'; img.src = e.target.result; // clean result before result.innerHTML = ''; // append new image result.appendChild(img); // show save btn and options save.classList.remove('hide'); options.classList.remove('hide'); // init cropper cropper = new Cropper(img); } }; reader.readAsDataURL(e.target.files[0]); } }); // save on click save.addEventListener('click', e => { e.preventDefault(); // get result to data uri let imgSrc = cropper.getCroppedCanvas({ width: img_w.value // input value }).toDataURL(); // remove hide class of img cropped.classList.remove('hide'); img_result.classList.remove('hide'); // show image cropped cropped.src = imgSrc; dwn.classList.remove('hide'); dwn.download = 'imagename.png'; dwn.setAttribute('href', imgSrc); });
That’s all! hopefully, you have successfully integrated this JavaScript image cropping library to crop an image before uploading. If you have any questions or suggestions, feel free to comment below.