IMG Cropped Upload
by Matheus Stein
HTML
<div class="container">
<p class="title">
IMG Cropped Upload
</p>
<p class="label">
01. Select your image
</p>
<input type="file" class="input" id="file" name="image" accept="image/*"/>
<div id="cropOptions">
<p class="label">
02. Select Crop Style
</p>
<div class="buttonHolder">
<span class="buttonOption" onClick="styleExpand()">Expand</span>
<span class="buttonOption btSelected" onClick="styleCrop()">Crop</span>
<span class="buttonOption" onClick="styleContain()">Contain</span>
</div>
<p class="label">
Result:
</p>
<canvas id="canvas"></canvas><br>
<span class="button" onClick="exportCanvas()">Upload</span>
</div>
<p class="label">
By. Matheus Stein
</p>
</div>
CSS
@import url('https://fonts.googleapis.com/css?family=Ubuntu+Mono:400,700');
body {
background: #20262e;
font-family: 'Ubuntu Mono', monospace;
color: #beccdd;
font-size: 14px;
margin: 0
}
#iframeHold {
display: none
}
.container {
width: 400px;
margin-left: calc( 50vw - 230px);
margin-top: 60px;
margin-bottom: 60px;
background: #292f36;
padding: 30px;
border-radius: 4px;
box-shadow: 0 3px 3px 0px rgba(0, 0, 0, 0.3);
}
hr {
margin-top: 24px;
margin-bottom: 24px;
border: 0.5px solid #beccdd;
}
.title {font-weight:bold}
textarea {
width: 376px;
min-height: 84px;
border: 0;
background: #494d54;
resize: none;
color: #beccdd;
padding: 12px;
border-radius: 4px;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2)
}
input {
font-family: 'Ubuntu Mono', monospace;
width: 376px;
border: 0;
background: #494d54;
resize: none;
color: #beccdd;
padding: 12px;
border-radius: 4px;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2)
}
.button {
display: inline-block;
padding: 12px 24px;
background: #30cbff;
border-radius: 2px;
color: #20262e;
font-weight: bold;
margin-right: 8px;
margin-top: 24px;
cursor: pointer;
transition: all 0.2s;
}
.buttonOption {
display:inline-block;
background: #494d54;
color: #beccdd;
padding: 12px;
box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.2);
float:left;
cursor:pointer;
}
.buttonOption:nth-child(1) {
border-radius:4px 0 0 4px;
}
.buttonOption:nth-child(3) {
border-radius:0px 4px 4px 0px;
}
.btSelected {
background: #292f36;
color: #beccdd;
box-shadow: inset 0 1px 3px 1px rgba(0, 0, 0, 0.5);
}
.buttonHolder {
display:inline-block;
width:100%;
}
#cropOptions {
display:none;
}
.copy {
position: fixed;
top: 16px;
left: 16px;
padding: 8px;
background: rgba(0, 0, 0, 0.5);
border-radius: 4px;
transition: all 0.3s;
opacity: 0;
}
.on {
opacity: 1;
}
#canvas {
border:1px solid rgba(0,0,0,0.4);
box-shadow: 0 2px 2px 0 rgba(0, 0,...
JavaScript
// Choose destination size
var destWidth=200;
var destHeight=100;
document.getElementById('file').onchange = function(e) {
img = new Image();
img.onload = draw;
img.onerror = failed;
img.src = URL.createObjectURL(this.files[0]);
};
function draw() {
canvas = document.getElementById('canvas');
canvas.width = destWidth;
canvas.height = destHeight;
ctx = canvas.getContext('2d');
//ctx.drawImage(this, 0,0);
document.getElementById('cropOptions').style.display = "block";
styleCrop();
}
function failed() {
console.error("The provided file couldn't be loaded as an Image media");
}
function styleExpand() {
document.getElementsByClassName('buttonOption')[0].className = "buttonOption btSelected";
document.getElementsByClassName('buttonOption')[1].className = "buttonOption";
document.getElementsByClassName('buttonOption')[2].className = "buttonOption";
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.drawImage(img, 0, 0, destWidth, destHeight)
}
function styleCrop() {
document.getElementsByClassName('buttonOption')[0].className = "buttonOption";
document.getElementsByClassName('buttonOption')[1].className = "buttonOption btSelected";
document.getElementsByClassName('buttonOption')[2].className = "buttonOption";
ctx.clearRect(0, 0, canvas.width, canvas.height);
var aspectDest = destWidth/destHeight;
var aspectImg = img.width/img.height;
if (aspectImg>aspectDest) {
var scale=destHeight/img.height;
var sH=img.height*scale;
var sW=img.width*scale;
var sX=-((sW-destWidth)/2);
ctx.drawImage(img, sX, 0, sW, sH);
}
else {
var scale=destWidth/img.width;
var sH=img.height*scale;
var sW=img.width*scale;
var sY=-((sH-destHeight)/2);
ctx.drawImage(img, 0, sY, sW, sH);
}
}
function styleContain() {
document.getElementsByClassName('buttonOption')[0].className = "buttonOption";
document.getElementsByClassName('buttonOption')[1].className = "buttonOption";
...