Новая интересная статья о теге canvas в HTML5 — Я покажу вам, как можно создать красивый и простой Paint . Основная идея — сделать область выбора цвета (градиент со всеми цветами радуги), а также загрузить изображения на canvas, где будут происходить действия с выбранным цветом.
Шаг 1. HTML
Вот html код нашего пейнта:
index.html
<!DOCTYPE html> <html lang="ru" > <head> <meta charset="utf-8" /> <title>HTML5 Canvas - Создание собственной программы Paint | officialplat-tt.ru</title> <link href="css/main.css" rel="stylesheet" type="text/css" /> <script src="js/jquery-1.5.2.min.js"></script> <script src="js/script.js"></script> </head> <body> <div class="container"> <div class="column1"> <canvas id="color" width="500" height="128"></canvas> <canvas id="panel" width="500" height="333"></canvas> </div> <div class="column2"> <div><input type="button" value="Next image" id="swImage" /></div> <div>Preview:</div> <div id="preview"></div> <div>Color:</div> <div id="pick"></div> <div>RGB: <input type="text" id="rgbVal" /></div> <hr /> </div> <div style="clear:both;"></div> </div> <footer> <h2>HTML5 Canvas - Создание собственной программы Paint</h2> <a href="http://officialplat-tt.ru/?p=1644" class="stuts">Вернуться на <span>officialplat-tt.ru</span></a> </footer> </body> </html>
Шаг 2. CSS
Вот наши CSS стили:
css/main.css
*{ margin:0; padding:0; } body { background-color:#bababa; color:#fff; font:14px/1.3 Arial,sans-serif; } footer { background-color:#212121; bottom:0; box-shadow: 0 -1px 2px #111111; display:block; height:70px; left:0; position:fixed; width:100%; z-index:100; } footer h2{ font-size:22px; left:50%; margin-left:-400px; padding:15px 0; position:absolute; width:540px; } footer a.stuts,a.stuts:visited{ border:none; text-decoration:none; color:#fcfcfc; font-size:14px; left:50%; line-height:31px; margin:23px 0 0 110px; position:absolute; top:0; } footer .stuts span { font-size:22px; font-weight:bold; margin-left:5px; } .container { color:#000; margin:20px auto; position:relative; width:730px; } .column1 { float:left; width:500px; } .column2 { float:left; padding-left:20px; width:170px; } #panel { border:1px #000 solid; box-shadow:4px 6px 6px #444444; cursor:crosshair; } #color { border:1px #000 solid; box-shadow:0px 4px 6px #444444; cursor:crosshair; } .column2 > div { margin-bottom:10px; } #swImage { border:1px #000 solid; box-shadow:2px 3px 3px #444444; cursor:pointer; height:25px; line-height:25px; border-radius:3px; -moz-border-radius:3px; -webkit-border-radius:3px; } #swImage:hover { margin-left:2px; } #preview, #pick { border:1px #000 solid; box-shadow:2px 3px 3px #444444; height:40px; width:80px; border-radius:3px; -moz-border-radius:3px; -webkit-border-radius:3px; } .column2 input[type=text] { float:right; width:110px; }
Шаг 3. JS
js/script.js
var canvas; var canvasColor; var ctx; var ctxColor; var bMouseDown = false; var selColorR = 0; var selColorG = 0; var selColorB = 0; var images = [ // создаем массив изображений, которЫе будут использоваться 'images/pic1.jpg', 'images/pic2.jpg', 'images/pic3.jpg', 'images/pic4.jpg', 'images/pic5.jpg' ]; var iActiveImage = 0; $(function(){ // отрисовка активного изображения var image = new Image(); image.onload = function () { ctx.drawImage(image, 0, 0, image.width, image.height); // отрисовываем изображение на canvas } image.src = images[iActiveImage]; // создание объектов canvas canvas = document.getElementById('panel'); ctx = canvas.getContext('2d'); canvasColor = document.getElementById('color'); ctxColor = canvasColor.getContext('2d'); drawGradients(ctxColor); $('#color').mousemove(function(e) { // обработчик движения мыши var canvasOffset = $(canvasColor).offset(); var canvasX = Math.floor(e.pageX - canvasOffset.left); var canvasY = Math.floor(e.pageY - canvasOffset.top); var imageData = ctxColor.getImageData(canvasX, canvasY, 1, 1); var pixel = imageData.data; var pixelColor = "rgba("+pixel[0]+", "+pixel[1]+", "+pixel[2]+", "+pixel[3]+")"; $('#preview').css('backgroundColor', pixelColor); }); $('#color').click(function(e) { // обработчик щелчка мыши var canvasOffset = $(canvasColor).offset(); var canvasX = Math.floor(e.pageX - canvasOffset.left); var canvasY = Math.floor(e.pageY - canvasOffset.top); var imageData = ctxColor.getImageData(canvasX, canvasY, 1, 1); var pixel = imageData.data; $('#rgbVal').val(pixel[0]+','+pixel[1]+','+pixel[2]); var pixelColor = "rgba("+pixel[0]+", "+pixel[1]+", "+pixel[2]+", "+pixel[3]+")"; $('#pick').css('backgroundColor', pixelColor); selColorR = pixel[0]; selColorG = pixel[1]; selColorB = pixel[2]; }); $('#panel').mousedown(function(e) { // обработчик нажатия мыши bMouseDown = true; }); $('#panel').mouseup(function(e) { // обработчик отжатия мыши bMouseDown = false; }); $('#panel').mousemove(function(e) { // обработчик движения мыши if (bMouseDown) { var canvasOffset = $(canvas).offset(); var canvasX = Math.floor(e.pageX - canvasOffset.left); var canvasY = Math.floor(e.pageY - canvasOffset.top); var imageData = ctx.getImageData(canvasX, canvasY, 1, 1); var pixel = imageData.data; pixel[0] = selColorR; // Red pixel[1] = selColorG; // Green pixel[2] = selColorB; // Blue pixel[3] = 255; // Alpha канал ctx.putImageData(imageData, canvasX, canvasY); } }); $('#swImage').click(function(e) { // переключение изображений iActiveImage++; if (iActiveImage >= 10) iActiveImage = 0; image.src = images[iActiveImage]; }); }); function drawGradients() { var grad = ctxColor.createLinearGradient(20, 0, canvasColor.width - 20, 0); grad.addColorStop(0, 'red'); grad.addColorStop(1 / 6, 'orange'); grad.addColorStop(2 / 6, 'yellow'); grad.addColorStop(3 / 6, 'green') grad.addColorStop(4 / 6, 'aqua'); grad.addColorStop(5 / 6, 'blue'); grad.addColorStop(1, 'purple'); ctxColor.fillStyle=grad; ctxColor.fillRect(0, 0, canvasColor.width, canvasColor.height); }
Итак, обратите внимание, что теперь у нас есть 2 полотна (canvas). Первый canvas — это наша палитра, второй canvas — место для рисования. Я отдельно создал функцию отрисовки разноцветного градиента: drawGradients. Затем добавил обработчики событий мыши. Нажимая мышью на полотне с градиентом, у нас сохраняется выбранный цвет. После чего можно «рисовать» на холсте с изображением. Все просто. В результате мы получили некое подобие Paint в HTML5!
Надеюсь, что сегодняшний урок был интересным для Вас. Мы сделали еще один хороший пример HTML5. Я буду рад, если Вы оставите комментарий и поделитесь ссылкой с друзьями. Удачи!
Получайте новые статьи блога прямо себе на почту
Скачал исходник, но в нём нельзя рисовать! В Демо всё нормально вроде)
Код в исходнике и демке одинаковый, соответственно и там и там должно работать. Попробуйте открыть index.html в гугл хроме
Открывал, но не наботает.
Странно, в том варианте, что расположен на этом сайте, должно работать. Если вы что-то меняли в исходниках, то проверьте правильно ли подгружается файл script.js
В исходниках ничего не менял. Просто скачал архив, разархивировал и запустил. Кстати, если убрать картинку фона, все работает. Но мне надо именно чтобы на картинке рисовать.
P.S. А можно реализовать тоже самое, но на простом HTML, без Javascript
Работает только в IE, как ни странно. В остальных браузерах не рисует на изображении. В чем проблема?
Еще работает в Firefox.
Здравствуйте. А возможно ли сделать более толстую кисть?