<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Photo Editor</title>

    <link rel="stylesheet" href="style.css">

</head>

<body>

    <div class="editor-container">

        <h1>Photo Editor</h1>

        <input type="file" id="upload" accept="image/*">

        <canvas id="canvas"></canvas>

        

        <div class="controls">

            <label>Brightness</label>

            <input type="range" id="brightness" min="0" max="200" value="100">

            

            <label>Contrast</label>

            <input type="range" id="contrast" min="0" max="200" value="100">

            

            <button onclick="applyFilter('grayscale(100%)')">Grayscale</button>

            <button onclick="applyFilter('sepia(100%)')">Sepia</button>

            <button onclick="applyFilter('invert(100%)')">Invert</button>

            <button onclick="applyFilter('blur(5px)')">Blur</button>

            <button onclick="resetImage()">Reset</button>

            <button onclick="downloadImage()">Download</button>

        </div>

    </div>

    <script src="script.js"></script>

</body>

</html>
body {

    font-family: Arial, sans-serif;

    text-align: center;

    background-color: #222;

    color: white;

}

.editor-container {

    margin: auto;

    padding: 20px;

    width: 60%;

    background: #333;

    border-radius: 10px;

    box-shadow: 2px 2px 10px rgba(0,0,0,0.5);

}

canvas {

    display: block;

    margin: 20px auto;

    max-width: 100%;

    border: 2px solid white;

    border-radius: 5px;

}

.controls {

    margin-top: 10px;

}

button, input[type="range"] {

    margin: 5px;

    padding: 10px;

    border: none;

    border-radius: 5px;

    cursor: pointer;

}

button {

    background: orange;

    color: white;

}

input[type="range"] {

    width: 150px;

}
const upload = document.getElementById("upload");

const canvas = document.getElementById("canvas");

const ctx = canvas.getContext("2d");

let image = new Image();

let originalImage = null;

upload.addEventListener("change", (event) => {

    const file = event.target.files[0];

    const reader = new FileReader();

    reader.onload = function () {

        image.src = reader.result;

    };

    reader.readAsDataURL(file);

});

image.onload = function () {

    canvas.width = image.width / 2;

    canvas.height = image.height / 2;

    ctx.drawImage(image, 0, 0, canvas.width, canvas.height);

    originalImage = ctx.getImageData(0, 0, canvas.width, canvas.height);

};

function applyFilter(filter) {

    ctx.clearRect(0, 0, canvas.width, canvas.height);

    ctx.filter = filter;

    ctx.drawImage(image, 0, 0, canvas.width, canvas.height);

}

document.getElementById("brightness").addEventListener("input", function () {

    updateImage();

});

document.getElementById("contrast").addEventListener("input", function () {

    updateImage();

});

function updateImage() {

    let brightness = document.getElementById("brightness").value;

    let contrast = document.getElementById("contrast").value;

    

    ctx.clearRect(0, 0, canvas.width, canvas.height);

    ctx.filter = `brightness(${brightness}%) contrast(${contrast}%)`;

    ctx.drawImage(image, 0, 0, canvas.width, canvas.height);

}

function resetImage() {

    ctx.putImageData(originalImage, 0, 0);

}

function downloadImage() {

    let link = document.createElement("a");

    link.download = "edited-image.png";

    link.href = canvas.toDataURL();

    link.click();

}

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://Weatherfor.lt/.com