рдХреИрдирд╡рд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡реЗрдм рд╡рд░реНрдХрд░реНрд╕

рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░


рдПрдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдпрд╣ рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдХрдИ рдХреЛ рдХреИрдирд╡рд╛рд╕ рдореЗрдВ рд╡реЗрдм рд╡рд░реНрдХрд░реНрд╕ рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИред рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдбреЛрдо рддрддреНрд╡реЛрдВ рдХреЛ рд╡реЗрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдкрд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╕рдорд╛рдзрд╛рди getImageData () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЖрд▓реЗрдЦ рдПрдХ рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдмреНрд▓рд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рдЗрд╕ рддрдХрдиреАрдХ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ 2 рдлрд╛рдЗрд▓реЗрдВ рдЪрд╛рд╣рд┐рдП: index.html рдФрд░ filter_worker.js

рдкреЗрдЬ рд▓реЗрдЖрдЙрдЯ


Index.html рдореЗрдВ рдЖрдкрдХреЛ рдПрдХ рдХреИрдирд╡рд╕ рддрддреНрд╡, рдмреНрд▓рд░ рд░реЗрдбрд┐рдпрд╕ рдФрд░ рд╕реНрдкреИрди рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлреЙрд░реНрдо рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╡рд░реНрддрдорд╛рди рдлрд╝рд┐рд▓реНрдЯрд░ рдСрдкрд░реЗрд╢рди рдХреЛ рдкреНрд░рддрд┐рд╢рдд рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВрдЧреЗред
рдПрдЪрдЯреАрдПрдордПрд▓
<!DOCTYPE html> <html> <head> <title>Web Worker</title> <style> #my_canvas { border: #00ff00 solid 1px; } </style> </head> <body> <form> <input type="text" id="radius" value="5" /> <input type="button" onclick="draw('my_canvas')" value="Draw" /> </form><br> <canvas id="my_canvas" width="200" height="200"></canvas><br> <span id="load_info"></span> </body> </html> 



рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ


рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝реЗрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдХреИрдирд╡рд╛рд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡реЗрдм рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВред
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ
 //   var img = new Image(); img.src = "Malevich.jpg"; function draw(canvas_name) { //    Web Workers? if(!window.Worker) { return alert('    Web Workers!'); } //   var canvas = document.getElementById(canvas_name); var ctx = canvas.getContext("2d"); //   ctx.clearRect(0,0,canvas.width,canvas.height); ctx.drawImage(img,0,0,img.width,img.height,0,0,img.width,img.height); var worker = new Worker('filter_worker.js'); //   worker worker.postMessage({ //  ImageData  worker imagedata: ctx.getImageData(0, 0, canvas.width, canvas.height), width: canvas.width, height: canvas.height, radius: document.getElementById("radius").value }); worker.onmessage = function (event) { if (event.data.status === 'complite') { //   Image Data   canvas ctx.putImageData(event.data.imagedata,0,0); } else { //     ,     document.getElementById("load_info").innerHTML = event.data.progress + "%"; } } } 



WebWorker


рдмреНрд▓рд░ рдлрд╝рд┐рд▓реНрдЯрд░ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рд╡рд░реНрддрдорд╛рди рдкрд┐рдХреНрд╕реЗрд▓ рд╕реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рднреАрддрд░ рдЧрд┐рд░рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд░рдВрдЧреЛрдВ рдХреЗ рдпреЛрдЧ рдХрд╛ рдФрд╕рдд рдЕрдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдореЗрдВ рдЖрдЙрдЯрдЧреЛрдЗрдВрдЧ рд░рдВрдЧ рд▓рд┐рдЦреЗрдВред
WebWorker
 onmessage = function (event) { var imagedata = event.data.imagedata; var width = event.data.width; var height = event.data.height; var radius = event.data.radius; var sum_r, sum_g, sum_b, sum_a; //  ,     var scale = (radius * 2 + 1) * (radius * 2 + 1) var num_pixels = width * height; function getPixel(x, y) { if (x < 0) { x = 0; } if (y < 0) { y = 0; } if (x >= width) { x = width - 1; } if (y >= height) { y = height - 1; } var index = (y * width + x) * 4; return [ imagedata.data[index + 0], imagedata.data[index + 1], imagedata.data[index + 2], imagedata.data[index + 3], ]; } function setPixel(x, y, r, g, b, a) { var index = (y * width + x) * 4; imagedata.data[index + 0] = r; imagedata.data[index + 1] = g; imagedata.data[index + 2] = b; imagedata.data[index + 3] = a; } var lastprogress = 0; for (y = 0; y < height; y++) { for (x = 0; x < width; x++) { var progress = Math.round((((y * width) + height) / num_pixels) * 100); if (progress > lastprogress) { lastprogress = progress; postMessage({status: 'progress', progress: progress}); } sum_r = 0; sum_g = 0; sum_b = 0; sum_a = 0; for (var dy = -radius; dy <= radius; dy++) { for (var dx = -radius; dx <= radius; dx++) { var pixeldata = getPixel(x + dx, y + dy); sum_r += pixeldata[0]; sum_g += pixeldata[1]; sum_b += pixeldata[2]; sum_a += pixeldata[3]; } } //    (     //     setPixel( x, y, Math.round(sum_r / scale), Math.round(sum_g / scale), Math.round(sum_b / scale), Math.round(sum_a / scale) ); } } postMessage({status: 'complite', imagedata: imagedata}); } 



рдирд┐рд╖реНрдХрд░реНрд╖:


рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЖрдк рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд╡реЗрдм рдкреЗрдЬ рдХреЛ рдлреНрд░реАрдЬ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рдмрдирддреА рд╣реИред

Source: https://habr.com/ru/post/In151722/


All Articles