Hello wizards, I hope you are doing great. Today in this blog you’ll learn how to create the "Image Editing" project using HTML, CSS & JavaScript.
Preview
In the above video, you’ve seen the preview of the "Image Editing" project and I hope now you are able to create this type of project. If not, I have provided all the HTML CSS and JavaScript code below.
Image Editing [Source Code]
To get the following HTML, CSS & JS code for the Image Editing project. You need to create three files one is a HTML file, second one is a CSS file and the another one is JS file. After creating these three files then you can copy-paste the given codes on your document.
Remember, you’ve to create a file with .html extension for HTML code, .css extension for CSS code and .js for JavaScript code.
You can also download all source code files from the given download button.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Image Editor</title> <link rel="stylesheet" href="style.css"> <!-- Font awesome cdn link --> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" integrity="sha512-iecdLmaskl7CVkqkXNQ/ZH/XLlvWZOJyj7Yy7tcenmpD1ypASozpmT/E0iPtmFIB46ZmdtAc9eNBvH0H/ZpiBw==" crossorigin="anonymous" referrerpolicy="no-referrer" /> </head> <body> <div class="container"> <div class="image"> <img src="panda.jpg" alt="iceland"> </div> <div class="filters"> <div class="filter"> <label for="saturation">Saturation</label> <div class="input"> <input type="range" min="0" max="200" id="saturation" value="100" oninput="this.nextElementSibling.value = this.value"> <output>100</output> </div> </div> <div class="filter"> <label for="blur">Blur</label> <div class="input"> <input type="range" min="0" max="10" id="blur" value="0" oninput="this.nextElementSibling.value = this.value"> <output>0</output> </div> </div> <div class="filter"> <label for="brightness">Brightness</label> <div class="input"> <input type="range" min="0" max="200" id="brightness" value="100" oninput="this.nextElementSibling.value = this.value"> <output>100</output> </div> </div> <div class="filter"> <label for="contrast">Contrast</label> <div class="input"> <input type="range" min="0" max="200" id="contrast" value="100" oninput="this.nextElementSibling.value = this.value"> <output>100</output> </div> </div> </div> <ul class="angles"> <li id="vertical"><i class="fa-solid fa-arrows-left-right up"></i></li> <li id="horizontal"><i class="fa-solid fa-arrows-left-right"></i></li> <li id="left"><i class="fa-solid fa-rotate-left"></i></li> <li id="right"><i class="fa-solid fa-rotate-right"></i></li> </ul> <div class="buttons"> <input type="file" class="file" accept="image/*" hidden> <button class="resetBtn">R</button> <button class="btn chooseBtn">Choose</button> <button class="btn saveBtn">Save</button> </div> </div> <script src="index.js"></script> </body> </html>
@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@100;200;300;400;500;600;700;800;900&display=swap"); * { margin: 0; padding: 0; box-sizing: border-box; font-family: "Poppins", sans-serif; } body, .container, .buttons, .filters, .filter, .angles, .input, .singleEffect { display: flex; align-items: center; justify-content: center; } body { min-height: 100vh; background-color: white; } .container { flex-direction: column; width: 400px; background-color: #f5bb00; color: black; padding: 20px; border-radius: 10px; } /* Image Container*/ .image { width: 100%; height: 260px; overflow: hidden; } img { max-width: 360px; max-height: 260px; width: 100%; height: 100%; object-fit: contain; } /* Filters Container */ .filters { flex-direction: column; width: 100%; gap: 15px; margin: 10px; } .filter { width: 100%; display: flex; justify-content: space-between; } label { font-size: 22px; } input { cursor: pointer; } output { width: 40px; text-align: end; } /* Angles Container */ .angles { list-style: none; gap: 30px; margin-top: 5px; margin-bottom: 20px; background-color: black; width: 100%; padding: 10px; border-radius: 10px; } .angles li { background-color: #f5bb00; color: black; padding: 10px 15px; border-radius: 50%; cursor: pointer; } .angles li:active { transform: scale(0.95); } .angles .up { transform: rotate(90deg); } /* Buttons Container */ .buttons { gap: 30px; } .btn { padding: 10px 30px; font-size: 18px; background-color: transparent; border: 3px solid black; color: black; border-radius: 5px; font-weight: 600; cursor: pointer; } .btn:hover { background-color: black; color: #f5bb00; } .btn:active { transform: scale(0.95); } .resetBtn { background-color: #8ea604; color: black; width: 30px; height: 30px; border-radius: 50%; border: none; box-shadow: 4px 4px black; cursor: pointer; } .resetBtn:active { position: relative; top: 4px; left: 4px; box-shadow: none; }
const imgEl = document.querySelector("img"); const filtersEl = document.querySelectorAll("input"); const anglesEl = document.querySelectorAll("li"); const fileEl = document.querySelector(".file"); const chooseBtnEl = document.querySelector(".chooseBtn"); const saveBtnEl = document.querySelector(".saveBtn"); const resetBtnEl = document.querySelector(".resetBtn"); let saturation = "100", blur = "0", brightness = "100", contrast = "100"; let rotate = 0, flipH = 1, flipV = 1; // when this function execute all changes will be set to initial values. const loadEl = () =>{ filtersEl[0].value = "100"; filtersEl[1].value = "0"; filtersEl[2].value = "100"; filtersEl[3].value = "100"; } // It generates result of the image as preview const generateResult = () => { imgEl.style.filter = `saturate(${saturation}%) blur(${blur}px) brightness(${brightness}%) contrast(${contrast}%)`; imgEl.style.transform = `rotate(${rotate}deg) scale(${flipH}, ${flipV})`; } // This will change the image rotation or flip when we click on any of the rotation or flip. anglesEl.forEach(element => { element.addEventListener("click", () => { if(element.id === "vertical") { flipV = flipV === 1 ? -1 : 1; } else if(element.id === "horizontal") { flipH = flipH === 1 ? -1 : 1; } else if(element.id === "left") { rotate = rotate - 90; } else { rotate = rotate + 90; } // It calls the generateResult function for every click on the rotation or flip flop generateResult(); }); }); // This will change the image filters when we give input on any of the filters. filtersEl.forEach(element => { element.addEventListener("input", () => { if(element.id === "saturation") { saturation = filtersEl[0].value; } else if(element.id === "blur") { blur = filtersEl[1].value; } else if(element.id === "brightness") { brightness = filtersEl[2].value; } else { contrast = filtersEl[3].value; } // It calls the generateResult function for every click on the rotation or flip flop generateResult(); }); }); // It resets the all values to initial conditions resetBtnEl.addEventListener("click", () => { saturation = "100", blur = "0", brightness = "100", contrast = "100"; rotate = 0, flipH = 1, flipV = 1; generateResult(); loadEl(); }) // This function adds image to the project when we choose a image. fileEl.addEventListener("change", ()=>{ let file = fileEl.files[0]; console.log(fileEl) if(!file) return; imgEl.src = URL.createObjectURL(file); imgEl.addEventListener("load", () => { resetBtnEl.click(); }); }) chooseBtnEl.addEventListener("click",()=>{ fileEl.click(); }) // when we click on save button it Saves our resultant image as ResultImage.jpg saveBtnEl.addEventListener("click",()=>{ const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d"); canvas.width = imgEl.naturalWidth; canvas.height = imgEl.naturalHeight; ctx.filter = `saturate(${saturation}%) blur(${blur}px) brightness(${brightness}%) contrast(${contrast}%)`; ctx.translate(canvas.width / 2, canvas.height / 2); if(rotate !== 0) { ctx.rotate(rotate * Math.PI / 180); } ctx.scale(flipH, flipV); ctx.drawImage(imgEl, -canvas.width / 2, -canvas.height / 2, canvas.width, canvas.height); const link = document.createElement("a"); link.download = "ResultImage.jpg"; link.href = canvas.toDataURL(); link.click(); }) // It calls loadEl function at the beginning i.e when the website is opened loadEl();