Cropper.js example
How do I make an cropper.js example?
Cropper.js is an image uploading and cropping tool that can easily be added to your website.. What is a cropper.js example? How do you make a cropper.js example? This script and codes were developed by Billy Brown on 30 September 2022, Friday.
Cropper.js example - Script Codes HTML Codes
<!DOCTYPE html>
<html >
<head> <meta charset="UTF-8"> <title>cropper.js example</title> <link rel="stylesheet" href="css/style.css">
</head>
<body> <label class="img-upload-label"> Upload Image: <input type="file" class="js-fileinput img-upload" accept="image/jpeg,image/png,image/gif">
</label>
<button class="js-export img-export">Export</button>
<canvas class="js-editorcanvas"></canvas>
<canvas class="js-previewcanvas"></canvas> <script src="js/index.js"></script>
</body>
</html>
Cropper.js example - Script Codes CSS Codes
html,
input { box-sizing: border-box; font-family: Helvetica, sans-serif;
}
* { box-sizing: inherit;
}
.hidden { display: none;
}
.img-export { display: block;
}
Cropper.js example - Script Codes JS Codes
'use strict';
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
/** * @file Allows uploading, cropping (with automatic resizing) and exporting * of images. * @author Billy Brown * @license MIT * @version 2.1.0 */
/** Class used for uploading images. */
var Uploader = function () { /** * <p>Creates an Uploader instance with parameters passed as an object.</p> * <p>Available parameters are:</p> * <ul> * <li>exceptions {function}: the exceptions handler to use, function that takes a string.</li> * <li>input {HTMLElement} (required): the file input element. Instantiation fails if not provided.</li> * <li>types {array}: the file types accepted by the uploader.</li> * </ul> * * @example * var uploader = new Uploader({ * input: document.querySelector('.js-fileinput'), * types: [ 'gif', 'jpg', 'jpeg', 'png' ] * }); * * * @param {object} options the parameters to be passed for instantiation */ function Uploader(options) { _classCallCheck(this, Uploader); if (!options.input) { throw '[Uploader] Missing input file element.'; } this.fileInput = options.input; this.types = options.types || ['gif', 'jpg', 'jpeg', 'png']; } /** * Listen for an image file to be uploaded, then validate it and resolve with the image data. */ Uploader.prototype.listen = function listen(resolve, reject) { var _this = this; this.fileInput.onchange = function (e) { // Do not submit the form e.preventDefault(); // Make sure one file was selected if (!_this.fileInput.files || _this.fileInput.files.length !== 1) { reject('[Uploader:listen] Select only one file.'); } var file = _this.fileInput.files[0]; var reader = new FileReader(); // Make sure the file is of the correct type if (!_this.validFileType(file.type)) { reject('[Uploader:listen] Invalid file type: ' + file.type); } else { // Read the image as base64 data reader.readAsDataURL(file); // When loaded, return the file data reader.onload = function (e) { return resolve(e.target.result); }; } }; }; /** @private */ Uploader.prototype.validFileType = function validFileType(filename) { // Get the second part of the MIME type var extension = filename.split('/').pop().toLowerCase(); // See if it is in the array of allowed types return this.types.includes(extension); }; return Uploader;
}();
function squareContains(square, coordinate) { return coordinate.x >= square.pos.x && coordinate.x <= square.pos.x + square.size.x && coordinate.y >= square.pos.y && coordinate.y <= square.pos.y + square.size.y;
}
/** Class for cropping an image. */
var Cropper = function () { /** * <p>Creates a Cropper instance with parameters passed as an object.</p> * <p>Available parameters are:</p> * <ul> * <li>size {object} (required): the dimensions of the cropped, resized image. Must have 'width' and 'height' fields. </li> * <li>limit {integer}: the longest side that the cropping area will be limited to, resizing any larger images.</li> * <li>canvas {HTMLElement} (required): the cropping canvas element. Instantiation fails if not provided.</li> * <li>preview {HTMLElement} (required): the preview canvas element. Instantiation fails if not provided.</li> * </ul> * * @example * var editor = new Cropper({ * size: { width: 128, height: 128 }, * limit: 600, * canvas: document.querySelector('.js-editorcanvas'), * preview: document.querySelector('.js-previewcanvas') * }); * * @param {object} options the parameters to be passed for instantiation */ function Cropper(options) { _classCallCheck(this, Cropper); // Check the inputs if (!options.size) { throw 'Size field in options is required'; } if (!options.canvas) { throw 'Could not find image canvas element.'; } if (!options.preview) { throw 'Could not find preview canvas element.'; } // Hold on to the values this.imageCanvas = options.canvas; this.previewCanvas = options.preview; this.c = this.imageCanvas.getContext("2d"); // Images larger than options.limit are resized this.limit = options.limit || 600; // default to 600px // Create the cropping square with the handle's size this.crop = { size: { x: options.size.width, y: options.size.height }, pos: { x: 0, y: 0 }, handleSize: 10 }; // Set the preview canvas size this.previewCanvas.width = options.size.width; this.previewCanvas.height = options.size.height; // Bind the methods, ready to be added and removed as events this.boundDrag = this.drag.bind(this); this.boundClickStop = this.clickStop.bind(this); } /** * Set the source image data for the cropper. * * @param {String} source the source of the image to crop. */ Cropper.prototype.setImageSource = function setImageSource(source) { var _this2 = this; this.image = new Image(); this.image.src = source; this.image.onload = function (e) { // Perform an initial render _this2.render(); // Listen for events on the canvas when the image is ready _this2.imageCanvas.onmousedown = _this2.clickStart.bind(_this2); }; }; /** * Export the result to a given image tag. * * @param {HTMLElement} img the image tag to export the result to. */ Cropper.prototype.export = function _export(img) { img.setAttribute('src', this.previewCanvas.toDataURL()); }; /** @private */ Cropper.prototype.render = function render() { this.c.clearRect(0, 0, this.imageCanvas.width, this.imageCanvas.height); this.displayImage(); this.preview(); this.drawCropWindow(); }; /** @private */ Cropper.prototype.clickStart = function clickStart(e) { // Get the click position and hold onto it for the expected mousemove var position = { x: e.offsetX, y: e.offsetY }; this.lastEvent = { position: position, resizing: this.isResizing(position), moving: this.isMoving(position) }; // Listen for mouse movement and mouse release this.imageCanvas.addEventListener('mousemove', this.boundDrag); this.imageCanvas.addEventListener('mouseup', this.boundClickStop); }; /** @private */ Cropper.prototype.clickStop = function clickStop(e) { // Stop listening for mouse movement and mouse release this.imageCanvas.removeEventListener("mousemove", this.boundDrag); this.imageCanvas.removeEventListener("mouseup", this.boundClickStop); }; /** @private */ Cropper.prototype.isResizing = function isResizing(coord) { var size = this.crop.handleSize; var handle = { pos: { x: this.crop.pos.x + this.crop.size.x - size / 2, y: this.crop.pos.y + this.crop.size.y - size / 2 }, size: { x: size, y: size } }; return squareContains(handle, coord); }; /** @private */ Cropper.prototype.isMoving = function isMoving(coord) { return squareContains(this.crop, coord); }; /** @private */ Cropper.prototype.drag = function drag(e) { var position = { x: e.offsetX, y: e.offsetY }; // Calculate the distance that the mouse has travelled var dx = position.x - this.lastEvent.position.x; var dy = position.y - this.lastEvent.position.y; // Determine whether we are resizing, moving, or nothing if (this.lastEvent.resizing) { this.resize(dx, dy); } else if (this.lastEvent.moving) { this.move(dx, dy); } // Update the last position this.lastEvent.position = position; this.render(); }; /** @private */ Cropper.prototype.resize = function resize(dx, dy) { var handle = { x: this.crop.pos.x + this.crop.size.x, y: this.crop.pos.y + this.crop.size.y }; // Maintain the aspect ratio var amount = Math.abs(dx) > Math.abs(dy) ? dx : dy; // Make sure that the handle remains within image bounds if (this.inBounds(handle.x + amount, handle.y + amount)) { this.crop.size.x += amount; this.crop.size.y += amount; } }; /** @private */ Cropper.prototype.move = function move(dx, dy) { // Get the opposing coordinates var tl = { x: this.crop.pos.x, y: this.crop.pos.y }; var br = { x: this.crop.pos.x + this.crop.size.x, y: this.crop.pos.y + this.crop.size.y }; // Make sure they are in bounds if (this.inBounds(tl.x + dx, tl.y + dy) && this.inBounds(br.x + dx, tl.y + dy) && this.inBounds(br.x + dx, br.y + dy) && this.inBounds(tl.x + dx, br.y + dy)) { this.crop.pos.x += dx; this.crop.pos.y += dy; } }; /** @private */ Cropper.prototype.displayImage = function displayImage() { // Resize the original to the maximum allowed size var ratio = this.limit / Math.max(this.image.width, this.image.height); this.image.width *= ratio; this.image.height *= ratio; // Fit the image to the canvas this.imageCanvas.width = this.image.width; this.imageCanvas.height = this.image.height; this.c.drawImage(this.image, 0, 0, this.image.width, this.image.height); }; /** @private */ Cropper.prototype.drawCropWindow = function drawCropWindow() { var pos = this.crop.pos; var size = this.crop.size; var radius = this.crop.handleSize / 2; this.c.strokeStyle = 'red'; this.c.fillStyle = 'red'; // Draw the crop window outline this.c.strokeRect(pos.x, pos.y, size.x, size.y); // Draw the draggable handle var path = new Path2D(); path.arc(pos.x + size.x, pos.y + size.y, radius, 0, Math.PI * 2, true); this.c.fill(path); }; /** @private */ Cropper.prototype.preview = function preview() { var pos = this.crop.pos; var size = this.crop.size; // Fetch the image data from the canvas var imageData = this.c.getImageData(pos.x, pos.y, size.x, size.y); if (!imageData) { return false; } // Prepare and clear the preview canvas var ctx = this.previewCanvas.getContext('2d'); ctx.clearRect(0, 0, this.previewCanvas.width, this.previewCanvas.height); // Draw the image to the preview canvas, resizing it to fit ctx.drawImage(this.imageCanvas, // Top left corner coordinates of image pos.x, pos.y, // Width and height of image size.x, size.y, // Top left corner coordinates of result in canvas 0, 0, // Width and height of result in canvas this.previewCanvas.width, this.previewCanvas.height); }; /** @private */ Cropper.prototype.inBounds = function inBounds(x, y) { return squareContains({ pos: { x: 0, y: 0 }, size: { x: this.imageCanvas.width, y: this.imageCanvas.height } }, { x: x, y: y }); }; return Cropper;
}();
function exceptionHandler(message) { console.log(message);
}
// Auto-resize the cropped image
var dimensions = { width: 128, height: 128 };
try { var uploader = new Uploader({ input: document.querySelector('.js-fileinput'), types: ['gif', 'jpg', 'jpeg', 'png'] }); var editor = new Cropper({ size: dimensions, canvas: document.querySelector('.js-editorcanvas'), preview: document.querySelector('.js-previewcanvas') }); // Make sure both were initialised correctly if (uploader && editor) { // Start the uploader, which will launch the editor uploader.listen(editor.setImageSource.bind(editor), function (error) { throw error; }); } // Allow the result to be exported as an actual image var img = document.createElement('img'); document.body.appendChild(img); document.querySelector('.js-export').onclick = function (e) { return editor.export(img); };
} catch (error) { exceptionHandler(error.message);
}
Developer | Billy Brown |
Username | _Billy_Brown |
Uploaded | September 30, 2022 |
Rating | 3 |
Size | 8,683 Kb |
Views | 62,744 |
Find the perfect freelance services for your business! Fiverr's mission is to change how the world works together. Fiverr connects businesses with freelancers offering digital services in 500+ categories. Find Developer!
Name | Size |
Pure CSS image slider | 2,256 Kb |
Canvas Pacman | 2,074 Kb |
Simple jQuery dice roller | 2,187 Kb |
Playing with FlexBox | 3,162 Kb |
Chaos | 1,660 Kb |
HMTL and CSS calendar | 3,153 Kb |
Better Transparent input boxes | 2,286 Kb |
Mandelbrot Fractal | 2,706 Kb |
Aperture-style lens | 3,703 Kb |
JavaScript Inheritance | 1,853 Kb |
Jasper is the AI Content Generator that helps you and your team break through creative blocks to create amazing, original content 10X faster. Discover all the ways the Jasper AI Content Platform can help streamline your creative workflows. Start For Free!
Name | Username | Size |
Multi column experiment. | Spylefkaditis | 2,805 Kb |
Drill-down Map | Good886 | 8,484 Kb |
700 Synapses Per Second | Silentkrange | 2,138 Kb |
Compare resources on mobile sites | Gyusza | 3,226 Kb |
Banner Ad | Raquellorenzana | 4,172 Kb |
Codero Sitemap | S1m0ne | 28,169 Kb |
Simple jQuery Slider | Jurbank | 2,874 Kb |
Pure CSS candle light animation by One element | Ksksoft | 2,193 Kb |
Hamburger Menu Animation | Salmanraza | 2,580 Kb |
Multicolumns 2 | Raphaelgoetter | 1,857 Kb |
Surf anonymously, prevent hackers from acquiring your IP address, send anonymous email, and encrypt your Internet connection. High speed, ultra secure, and easy to use. Instant setup. Hide Your IP Now!