Tein javascriptiä käyttäen colorpickerin.
En löytänyt ratkaisua siihen, että kun sivua pienennetään, niin ohjelma näyttää värejä vääristä paikoista. Koodeja saa 'haukkua' :D
HTML:
<!DOCTYPE html> <html> <head> <link rel="stylesheet" type="text/css" href="style.css"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta charset="UTF-8"> <title>Colorpicker</title> </head> <body> <h1> <span style='color: #483FF6'>C</span> <span style='color: red'>o</span> <span style='color: yellow'>l</span> <span style='color: #483FF6'>o</span> <span style='color: green'>r</span> <span style='color: yellow; margin-left: 20px'>p</span> <span style='color: #483FF6'>i</span> <span style='color: red'>c</span> <span style='color: yellow'>k</span> <span style='color: #483FF6'>e</span> <span style='color: green'>r</span> </h1> <input type="file" name="file" class="inputfile" accept="image/*" onchange="updateImage(event)"> <hr> <canvas id="test-image" width="400" height="300"></canvas> <hr> <canvas id="colors" width="60" height="60"></canvas> <div class="tb"> <div id="choosed-color"></div> <button id="copy"><strong>Copy to clipboard</strong></button> </div> <footer> <p class="copyright">AtskaFin</p> </footer> <script src="code.js"></script> </body> </html>
CSS:
html { background: rgb(182, 70, 70); overflow: hidden; } body { background: whitesmoke; height: 100vh; margin: 0; width: 50vw; margin: auto; border: 2px solid #101010; text-align: center; font-family: Impact, Haettenschweiler, 'Arial Narrow Bold', sans-serif !important; } h1 span { text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; font-size: 3rem; } canvas { background: white; cursor: pointer; } #test-image { border: 2px solid #242323; } #colors { border: 1px solid #242323; } #choosed-color { border: 1px solid #242323; width: 100px; height: 30px; text-align: center; display: table-cell; vertical-align: middle; color: white; text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; background: white; font-size: 1.3rem; } .tb { display: table; margin-left:auto; margin-right:auto; padding: 10px; } .tb button:before { content: '+ '; } .tb button { display: table-cell; height: 32px; margin-left: 10px; background: white; border: 1px solid black; color: black; padding: 5px 10px; transition: background-color 0.1s; } .tb button:hover { background: black; color: white; } footer { text-align: center; background-color: #424242; font-size: 1.5rem; margin-top: 5rem; padding: 20px; border-top: 1px solid #303030; box-shadow: 0 -2px 0 #212121; color: whitesmoke; } .copyright { margin: 0; text-shadow: -1px 0 black, 0 1px black, 1px 0 black, 0 -1px black; } .copyright:before { content: 'Ⓒ'; margin-right: 10px; } @media (max-width: 576px) { body { width: 100%;} #test-image { width: 95%;} h1 span { font-size: 2rem; } } @media (min-width: 576px) { footer { position: fixed; left: 0; bottom: 0; width: 100%; } }
JS:
function el(id) { return document.getElementById(id); } const testImage = el('test-image'); const testImageCtx = testImage.getContext('2d'); const colorCanvas = el('colors'); const colorCanvasCtx = colorCanvas.getContext('2d'); const choosedColor = el('choosed-color'); const copyBtn = el('copy'); var freeze = false; var started = false; function updateImage (event) { testImageCtx.beginPath(); testImageCtx.fillStyle = 'whitesmoke'; testImageCtx.fillRect(0, 0, testImage.width, testImage.height); testImageCtx.closePath(); let reader = new FileReader(); reader.onload = (e) => { let img = new Image(); img.onload = () => { testImageCtx.drawImage(img, 0, 0, img.width, img.height, 0, 0, testImage.width, testImage.height); } img.src = e.target.result; } reader.readAsDataURL(event.target.files[0]); started = true; freeze = false; } function rgbToHex(r, g, b) { return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1); } function drawColor (color, x, y) { colorCanvasCtx.beginPath(); colorCanvasCtx.fillStyle = color; colorCanvasCtx.fillRect(x * 12, y * 12, 12, 12); colorCanvasCtx.closePath(); } function drawColors (pieces) { for(let a = 0; a < Math.sqrt(pieces.length); a++) { drawColor(pieces[a * 5], 0, a); drawColor(pieces[a * 5 + 1], 1, a); drawColor(pieces[a * 5 + 2], 2, a); drawColor(pieces[a * 5 + 3], 3, a); drawColor(pieces[a * 5 + 4], 4, a); } } testImage.addEventListener('mousemove', (event) => { if(started && !freeze) { let imgData = testImageCtx.getImageData(event.offsetX - 2, event.offsetY - 2, 5, 5); let data = imgData.data; let pieces = []; for(let i = 0; i < 25; i++) { pieces.push(rgbToHex(data[i * 4], data[i * 4 + 1], data[i * 4 + 2])); } drawColors(pieces); } }); testImage.addEventListener('click', () => { if(started) { freeze = !freeze; // Asetetaan hiiren kohdalla oleva pikseli valituksi let imgData = colorCanvasCtx.getImageData(30, 30, 1, 1); let data = imgData.data; let HEX = rgbToHex(data[0], data[1], data[2]) choosedColor.style.backgroundColor = HEX; choosedColor.innerHTML = HEX; } }); colorCanvas.addEventListener('click', (event) => { if(started) { let imgData = colorCanvasCtx.getImageData(event.offsetX, event.offsetY, 1, 1); let data = imgData.data; let HEX = rgbToHex(data[0], data[1], data[2]) choosedColor.style.backgroundColor = HEX; choosedColor.innerHTML = HEX; } }); copyBtn.addEventListener('click', () => { var range = document.createRange(); range.selectNode(choosedColor); window.getSelection().removeAllRanges(); window.getSelection().addRange(range); if(range == '') { alert('Choose color!'); } else { document.execCommand("copy"); alert('copied: ' + range); } window.getSelection().removeAllRanges(); });
Aihe on jo aika vanha, joten et voi enää vastata siihen.