<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        使用canvas進行圖像編輯的實例

        來源:懂視網 責編:小采 時間:2020-11-27 22:31:40
        文檔

        使用canvas進行圖像編輯的實例

        使用canvas進行圖像編輯的實例:前面的話 本文將分為幾個小功能的形式來詳細介紹canvas圖像編輯 縮放 下面是一張分析圖,假設默認情況下,圖片和canvas寬高相同。圖片的縮放(scale)范圍為0.5到3,縮放時改變的是圖片的大小和圖片的坐標位置 W(寬) = canvas.width * scal
        推薦度:
        導讀使用canvas進行圖像編輯的實例:前面的話 本文將分為幾個小功能的形式來詳細介紹canvas圖像編輯 縮放 下面是一張分析圖,假設默認情況下,圖片和canvas寬高相同。圖片的縮放(scale)范圍為0.5到3,縮放時改變的是圖片的大小和圖片的坐標位置 W(寬) = canvas.width * scal

        前面的話

        本文將分為幾個小功能的形式來詳細介紹canvas圖像編輯

        縮放

        下面是一張分析圖,假設默認情況下,圖片和canvas寬高相同。圖片的縮放(scale)范圍為0.5到3,縮放時改變的是圖片的大小和圖片的坐標位置

        W(寬) = canvas.width * scale
        H(高) = canvas.height * scale
        x坐標 = (W - canvas.width)/2;
        y坐標 = (H - canvas.height)/2;

        因此,代碼如下

        <canvas id="drawing" >
         <p>The canvas element is not supported!</p>
        </canvas>
        <br>
        <input id="scale-range" min="0.5" max="1.5" step="0.01" type="range" >
        <script>
        var drawing = document.getElementById('drawing');
        if(drawing.getContext){
         var context = drawing.getContext('2d');
         var slider = document.getElementById('scale-range');
         var W = 400;
         var H = 290; 
         drawing.width = W; 
         drawing.height = H;
         var image = new Image();
         image.src="http://sandbox.runjs.cn/uploads/rs/26/ddzmgynp/chunfen.jpg";
         image.onload = function(){
         drawImgByScale(slider.value);
         slider.onmousemove = function(){
         drawImgByScale(slider.value);
         }
         }
         function drawImgByScale(scale){
         var imgW = W * scale;
         var imgH = H * scale;
         var dx =(W - imgW)/2;
         var dy =(H - imgH)/2;
         context.clearRect(0,0,W,H);
         context.drawImage(image,dx,dy,imgW,imgH);
         }
        } 
        </script>

        水印

        利用canvas可以實現向圖片添加水印的功能,先通過file控件的reader選擇圖片,然后使用canvas添加圖片及水印,并且使用toDataURL()和a標簽實現添加水印后的圖片的下載功能

        <canvas id="drawing" >
         <p>The canvas element is not supported!</p>
        </canvas>
        <div>
         <span>
         <input type="file" id="addImgHelper" >
         <button id="addImg">選擇圖片</button>
         </span>
         <span>
         <button id="addWaterMark" disabled>添加水印</button> 
         <span>水印文字為</span>
         <input id="waterMarkWords" type="text" value="小火柴的藍色理想"> 
         </span>
         <span>
         <button id="downloadImg" disabled>下載圖片</button>
         <a id="downloadImgHelper" href="#" rel="external nofollow" download="帶水印圖片" ></a> 
         </span>
        </div>
        <script>
        if(drawing.getContext){
         var cxt = drawing.getContext('2d');
         var W,H; 
         addImg.onclick = function(){
         addImgHelper.click();
         }
         addImgHelper.onchange = function(){
         addWaterMark.disabled = true;
         downloadImg.disabled = true;
         var file = addImgHelper.files[0];
         if(file && /image/.test(file.type)){
         var reader = new FileReader();
         reader.readAsDataURL(file);
         reader.onload = function(){
         var img = new Image();
         img.src= reader.result;
         img.onload = function(){
         addWaterMark.disabled = false;
         drawing.width = W = img.width;
         drawing.height = H = img.height;
         cxt.drawImage(img,0,0);
         addWaterMark.onclick = function(){
         downloadImg.disabled = false;
         cxt.clearRect(0,0,W,H);
         cxt.drawImage(img,0,0); 
         var str = waterMarkWords.value;
         cxt.font = "bold 50px Arial";
         cxt.lineWidth = '1';
         cxt.fillStyle = 'rgba(255,255,255,0.5)';
         cxt.textBaseline = "bottom";
         cxt.textAlign = 'end';
         cxt.fillText(str,W-10,H-10,W/2); 
         downloadImg.onclick = function(){
         downloadImgHelper.href = drawing.toDataURL('image/png');
         downloadImgHelper.click(); 
         } 
         } 
         }
         } 
         } 
         } 
        }
        </script>

        放大鏡

        下面來實現一個放大鏡的效果,鼠標按下并移動時,顯示當前圖片區域的放大效果,抬起后效果消失。放大鏡效果主要使用離屏canvas的技術,離屏canvas放置的是圖片的放大版,而普通canvas則放置圖片的正常版

        <canvas id="drawing" >
         <p>The canvas element is not supported!</p>
        </canvas>
        <canvas id="drawingOff" >
         <p>The canvas element is not supported!</p>
        </canvas>
        <script>
        if(drawing.getContext){
         var cxt = drawing.getContext('2d');
         var cxtOff = drawingOff.getContext('2d');
         var W,H; 
         var scale = 1.5; 
         var img = new Image();
         img.src="http://sandbox.runjs.cn/uploads/rs/26/ddzmgynp/chunfen.jpg";
         img.onload = function(){
         W = img.width;
         H = img.height;
         drawing.width = W/scale;
         drawing.height = H/scale;
         drawingOff.width = W;
         drawingOff.height = H;
         cxt.drawImage(img,0,0,W/scale,H/scale);
         cxtOff.drawImage(img,0,0);
         drawing.onmousedown = function(e){
         e = e || event;
         var x0 = this.offsetLeft;
         var y0 = this.offsetTop; 
         drawMagnifier(e);
         drawing.onmousemove = function(e){
         drawMagnifier(e);
         }
         document.onmouseup = function(e){
         cxt.clearRect(0,0,W/scale,H/scale);
         cxt.drawImage(img,0,0,W/scale,H/scale);
         drawing.onmousemove = null;
         } 
         function drawMagnifier(e){
         cxt.clearRect(0,0,W/scale,H/scale);
         cxt.drawImage(img,0,0,W/scale,H/scale);
         var x = (e.clientX-x0);
         var y = (e.clientY-y0); 
         var r = 40;
         var dx = x - r;
         var dy = y - r;
         var sx = x*scale - r;
         var sy = y*scale - r;
         cxt.save();
         cxt.beginPath();
         cxt.arc(x,y,r,0,Math.PI*2);
         cxt.lineWidth = 4;
         cxt.strokeStyle = '#069';
         cxt.stroke();
         cxt.clip();
         cxt.drawImage(drawingOff,sx,sy,2*r,2*r,dx,dy,2*r,2*r);
         cxt.restore(); 
         }
         }
         } 
        }
        </script>

        濾鏡

        下面利用canvas的getImageData()方法,獲取原始圖像數據,通過對圖像數據進行修改,然后輸出修改后的圖像數據

        <canvas id="drawing1" >
         <p>The canvas element is not supported!</p>
        </canvas>
        <canvas id="drawing2" >
         <p>The canvas element is not supported!</p>
        </canvas>
        <br>
        <button id="noGreen">無綠色</button>
        <button id="noBlue">無藍色</button>
        <button id="toGrey">灰度</button>
        <button id="toBlackWhite">黑白</button>
        <button id="reverse">反色</button>
        <script>
        if(drawing1.getContext){
         var cxt1 = drawing1.getContext('2d');
         var cxt2 = drawing2.getContext('2d');
         var img = new Image();
         img.src="chunfen.jpg";
         img.onload = function(){
         cxt1.drawImage(img,0,0);
         function filter(fn){
         var imageData = cxt1.getImageData(0,0,img.width,img.height); 
         cxt2.clearRect(0,0,drawing2.width,drawing2.height); 
         var data = imageData.data;
         for(var i = 0, len = data.length; i < len; i+=4){
         fn(data,i)
         }
         imageData.data = data;
         cxt2.putImageData(imageData,0,0); 
         }
         function fnNoGreen(data,i){
         data[i+1] = 0;
         }
         function fnNoBlue(data,i){
         data[i+2] = 0;
         } 
         function fnReverse(data,i){
         var red = data[i];
         var green = data[i+1];
         var blue = data[i+2];
         var alpha = data[i+3];
         data[i] = 255 - red;
         data[i+1] = 255 - green;
         data[i+2] = 255 - blue;
         } 
         function fnToGrey(data,i){
         var red = data[i];
         var green = data[i+1];
         var blue = data[i+2];
         var alpha = data[i+3];
         var average = Math.floor((red+green+blue)/3);
         data[i] = data[i+1] = data[i+2] = average; 
         } 
         function fnToBlackWhite(data,i){
         var red = data[i];
         var green = data[i+1];
         var blue = data[i+2];
         var alpha = data[i+3];
         var average = Math.floor((red+green+blue)/3);
         if(average > 255/2){
         var result = 255;
         }else{
         var result = 0;
         }
         data[i] = data[i+1] = data[i+2] = result; 
         }
         toGrey.onclick = function(){
         filter(fnToGrey);
         }
         noGreen.onclick = function(){
         filter(fnNoGreen);
         } 
         noBlue.onclick = function(){
         filter(fnNoBlue);
         } 
         toBlackWhite.onclick = function(){
         filter(fnToBlackWhite);
         }
         reverse.onclick = function(){
         filter(fnReverse);
         } 
         }
        }
        </script>

        馬賽克效果

        【普通模糊效果】

        普通模糊效果不僅需要使用當前像素點,還需要使用周圍的像素點,并把這些像素點都賦予平均值

        function fnToBlur(n){
         cxt2.clearRect(0,0,drawing2.width,drawing2.height); 
         var imageData = cxt1.getImageData(0,0,drawing2.width,drawing2.height); 
         var tempImageData = imageData;
         var data = imageData.data;
         var tempData = tempImageData.data;
         var blurR = n;
         var totalnum = (2*blurR + 1)*(2*blurR + 1);
         for(var i = blurR; i < drawing2.height - blurR; i++){
         for(var j = blurR; j < drawing2.width - blurR; j++){
         var totalr = 0, totalg = 0, totalb = 0;
         for(var dx = -blurR; dx <= blurR; dx++){
         for(var dy = -blurR; dy <= blurR; dy++){
         var x = i + dx;
         var y = j + dy;
         var p = x*drawing2.width + y;
         totalr += tempData[p*4+0];
         totalg += tempData[p*4+1];
         totalb += tempData[p*4+2];
         }
         }
         var p = i*drawing2.width + j;
         data[p*4+0] = totalr / totalnum;
         data[p*4+1] = totalg / totalnum;
         data[p*4+2] = totalb / totalnum;
         }
         }
         imageData.data = data;
         cxt2.putImageData(imageData,0,0); 
         }

        【馬賽克效果】

        馬賽克效果則是把一塊區域的值,全部都賦予平均值

        function fnToMosaic(n){
         cxt2.clearRect(0,0,drawing2.width,drawing2.height); 
         var imageData = cxt1.getImageData(0,0,drawing2.width,drawing2.height); 
         var tempImageData = imageData;
         var data = imageData.data;
         var tempData = tempImageData.data;
         var size = n;
         var totalnum = size*size;
         for(var i = 0; i < drawing2.height; i+=size){
         for(var j = 0; j < drawing2.width; j+=size){
         var totalr = 0, totalg = 0, totalb = 0;
         for(var dx = 0; dx < size; dx++){
         for(var dy = 0; dy < size; dy++){
         var x = i + dx;
         var y = j + dy;
         var p = x*drawing2.width + y;
         totalr += tempData[p*4+0];
         totalg += tempData[p*4+1];
         totalb += tempData[p*4+2];
         }
         }
         var p = i*drawing2.width + j;
         var resr = totalr / totalnum;
         var resg = totalg / totalnum;
         var resb = totalb / totalnum;
         for(var dx = 0; dx < size; dx++){
         for(var dy = 0; dy < size; dy++){
         var x = i + dx;
         var y = j + dy;
         var p = x*drawing2.width + y;
         data[p*4+0]= resr;
         data[p*4+1]= resg;
         data[p*4+2]= resb;
         }
         }
         }
         }
         imageData.data = data;
         cxt2.putImageData(imageData,0,0); 
         }

        下面是一個實例

        <canvas id="drawing1" >
         <p>The canvas element is not supported!</p>
        </canvas>
        <canvas id="drawing2" >
         <p>The canvas element is not supported!</p>
        </canvas>
        <br>
        <button id="toLightBlur">輕度模糊</button>
        <button id="toHeavyBlur">重度模糊</button>
        <button id="toLightMosaic">輕度馬賽克</button>
        <button id="toHeavyMosaic">重度馬賽克</button>
        <script>
        if(drawing1.getContext){
         var cxt1 = drawing1.getContext('2d');
         var cxt2 = drawing2.getContext('2d');
         var img = new Image();
         img.src="chunfen.jpg";
         img.onload = function(){
         cxt1.drawImage(img,0,0);
         toLightBlur.onclick = function(){
         fnToBlur(1);
         }
         toHeavyBlur.onclick = function(){
         fnToBlur(3);
         } 
         toLightMosaic.onclick = function(){
         fnToMosaic(4);
         } 
         toHeavyMosaic.onclick = function(){
         fnToMosaic(9);
         } 
         function fnToBlur(n){
         cxt2.clearRect(0,0,drawing2.width,drawing2.height); 
         var imageData = cxt1.getImageData(0,0,drawing2.width,drawing2.height); 
         var tempImageData = imageData;
         var data = imageData.data;
         var tempData = tempImageData.data;
         var blurR = n;
         var totalnum = (2*blurR + 1)*(2*blurR + 1);
         for(var i = blurR; i < drawing2.height - blurR; i++){
         for(var j = blurR; j < drawing2.width - blurR; j++){
         var totalr = 0, totalg = 0, totalb = 0;
         for(var dx = -blurR; dx <= blurR; dx++){
         for(var dy = -blurR; dy <= blurR; dy++){
         var x = i + dx;
         var y = j + dy;
         var p = x*drawing2.width + y;
         totalr += tempData[p*4+0];
         totalg += tempData[p*4+1];
         totalb += tempData[p*4+2];
         }
         }
         var p = i*drawing2.width + j;
         data[p*4+0] = totalr / totalnum;
         data[p*4+1] = totalg / totalnum;
         data[p*4+2] = totalb / totalnum;
         }
         }
         imageData.data = data;
         cxt2.putImageData(imageData,0,0); 
         }
         function fnToMosaic(n){
         cxt2.clearRect(0,0,drawing2.width,drawing2.height); 
         var imageData = cxt1.getImageData(0,0,drawing2.width,drawing2.height); 
         var tempImageData = imageData;
         var data = imageData.data;
         var tempData = tempImageData.data;
         var size = n;
         var totalnum = size*size;
         for(var i = 0; i < drawing2.height; i+=size){
         for(var j = 0; j < drawing2.width; j+=size){
         var totalr = 0, totalg = 0, totalb = 0;
         for(var dx = 0; dx < size; dx++){
         for(var dy = 0; dy < size; dy++){
         var x = i + dx;
         var y = j + dy;
         var p = x*drawing2.width + y;
         totalr += tempData[p*4+0];
         totalg += tempData[p*4+1];
         totalb += tempData[p*4+2];
         }
         }
         var p = i*drawing2.width + j;
         var resr = totalr / totalnum;
         var resg = totalg / totalnum;
         var resb = totalb / totalnum;
         for(var dx = 0; dx < size; dx++){
         for(var dy = 0; dy < size; dy++){
         var x = i + dx;
         var y = j + dy;
         var p = x*drawing2.width + y;
         data[p*4+0]= resr;
         data[p*4+1]= resg;
         data[p*4+2]= resb;
         }
         }
         }
         }
         imageData.data = data;
         cxt2.putImageData(imageData,0,0); 
         } 
         }
        }
        </script>

        以上這篇使用canvas進行圖像編輯的實例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        使用canvas進行圖像編輯的實例

        使用canvas進行圖像編輯的實例:前面的話 本文將分為幾個小功能的形式來詳細介紹canvas圖像編輯 縮放 下面是一張分析圖,假設默認情況下,圖片和canvas寬高相同。圖片的縮放(scale)范圍為0.5到3,縮放時改變的是圖片的大小和圖片的坐標位置 W(寬) = canvas.width * scal
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 麻豆成人精品国产免费| 国产成人免费在线| 亚洲福利精品电影在线观看| 亚洲国产av玩弄放荡人妇| 性感美女视频在线观看免费精品 | 婷婷国产偷v国产偷v亚洲| 在线观看无码的免费网站| 亚洲人成自拍网站在线观看| 我想看一级毛片免费的| 欧洲亚洲综合一区二区三区| 亚洲国产精品一区二区第四页| 九一在线完整视频免费观看| 老司机亚洲精品影视www| 中文字幕免费人成乱码中国| 亚洲av中文无码乱人伦在线r▽| 日本免费一区二区三区| 亚洲国产精品线观看不卡| 日韩精品成人无码专区免费| 国产成人综合亚洲绿色| 久99精品视频在线观看婷亚洲片国产一区一级在线 | 免费国产人做人视频在线观看| 一个人免费观看www视频| 亚洲AV永久精品爱情岛论坛| 黄色免费网站网址| 精品久久久久久亚洲综合网| 亚洲无码精品浪潮| 99久久99久久精品免费观看| 久久乐国产综合亚洲精品| 亚洲日本韩国在线| 中国xxxxx高清免费看视频| 亚洲精品无码久久久久APP| 久久久久亚洲AV成人网人人软件| 久久国产高潮流白浆免费观看| 免费精品久久天干天干| 亚洲理论在线观看| 免费在线观看理论片| 8x成人永久免费视频| 国产精品亚洲二区在线| 亚洲综合久久综合激情久久| 日产乱码一卡二卡三免费| 日本一道本不卡免费|