Canvas實現放大鏡效果完整案例

本文主要記錄 canvas 在影像、文字處理、離屏技術和放大鏡特效的實現過程中使用到的API。先看下效果吧:
一張模糊的圖片:

滑鼠點擊任意位置,產生放大效果:

哇塞~ 一個帥哥,哈哈哈哈~

1、顯示模糊照片

其實一般的交互不是模糊照片,這裡我只是為了誇張下效果,用了張模糊的原圖,哈哈哈,canvas本身是可以對清晰的圖片做濾鏡處理,涉及到很多圖形學的演算法,然後我不會,默默的打開了PS手動高斯模糊了一張照片…嗯,沒毛病!
首先定義一個canvas元素

  <canvas id="canvas"></canvas>
//定義canvas畫布
var canvas1 = document.getElementById('canvas1');
    ctx1 = canvas.getContext('2d');

//模糊圖片載入
var image1 = new Image();
image1.src = "./模糊.png";

//圖片載入成功後繪製圖片
image1.onload = function() {
  //drawImage 在畫布上繪製模糊圖片
  ctx1.drawImage(image1, 0, 0, canvas1.width, canvas1.height);
};     

ctx1.drawImage(圖片,x位置,y位置,圖片顯示寬度,圖片顯示高度)

2、放大鏡原理

實現效果:如上圖,點擊或點擊滑動滑鼠顯示一個區域,區域中顯示對應點擊部分範圍的放大清晰圖片。那麼問題就可以肢解為3部分:

1、如何在canvas(模糊圖)上再畫出另外一個canvas(清晰放大圖);
2、如何將canvas中顯示的(清晰放大圖)剪切出圓形區域。
3、如何在滑鼠點擊滑動的時候顯示該區域;

3、載入清晰圖片

我們再加一個canvas(放大鏡看到的圖片),初始隱藏:

<canvas id="canvas2" style="display:none"></canvas>
var canvas2 = document.getElementById('canvas2'),
    ctx2 = canvas2.getContext('2d'),
    scale = 2; // 放大倍數

// canvas2的圖片大小是模糊圖片的2倍
canvas2.width = canvas.width * scale;
canvas2.height = canvas.height * scale;

// 在canvas2中載入圖片
var image2 = new Image();
image2.src = "name2.png";

image2.onload = function() {
  ctx2.drawImage(image2, 0, 0, canvas2.width, canvas2.height);
};

3、顯示放大鏡

3.1 繪製放大鏡

滑鼠所處的位置點(x,y)是區域的中心,計算出清晰圖所在的位置點,我們先假設繪製一個正方形;

// 圓的半徑是mr
var mr = 100;

// 對應模糊圖的左上角起點
var dx = x - mr,
    dy = y - mr;

// 找出清晰圖截圖的左上角起點
var sx = x * scale - mr,
    sy = y * scale- mr;

截取圓形

// 保存當前狀態
ctx.save();
// 邊框
ctx.strokeStyle = "#9eddf1";
ctx.lineWidth = 3;
// 開始繪製
ctx.beginPath();
// ⚪
ctx.arc(x, y, mr, 0, Math.PI * 2);
ctx.stroke();
// 表示剪切
ctx.clip();
// 釋放當前狀態
ctx.restore();

繪製狀態的最佳搭檔save()和restore():用於對當前狀態的保存及釋放不影響其他操作;可用於重複的繪製圖形的變化過程;
clip():表示剪切區域

3.2 離屏技術

所謂的離屏技術就是在一個canvas上繪製另外一個canvas,前面使用的繪製圖片的API是drawImage(),它分別可以支援,3個、5個和9個參數; 其中第一個參數既可以是圖片,也可以是canvas對象!那麼我們就可以使用這個方法,在圓上繪製出清晰圖了~

    // 在對應的位置上重新繪製圖片
    //drawImage(img,sx,sy,swidth,sheight,x,y,width,height) 9個參數時
    //img: 圖片/canvas
    //sx: 圖片的X起點
    //sy: 圖片的Y起點
    //swidth:要繪製的圖片選取的寬度
    //sheight:要繪製的圖片選取的高度
    //x,y:圖片在canvas上顯示的位置
    //width,height:在Canvas上要顯示的大小

    ctx1.drawImage(canvas2, sx, sy, 2 * mr, 2 * mr, dx, dy, 2 * mr, 2 * mr);

4、滑鼠交互事件

效果:滑鼠點擊並滑動滑鼠產生反應,鬆開滑鼠或者移除畫布則失效。處理如下:

//定義一個判斷滑鼠是否是點擊滑動的標識符
var flag;

//滑鼠點入事件
canvas.onmousedown = function(e) {
  flag = true;
  //顯示放大鏡
}
// 滑鼠移動事件
canvas.onmousemove = function(e) {
  if (flag) {
    //顯示放大鏡
  }
}
//滑鼠鬆開事件
canvas.onmouseup = function(e) {
  flag = false;
  // 隱藏放大鏡
}
//滑鼠離開事件
canvas.onmouseout = function(e) {
  flag = false;
  // 隱藏放大鏡
}
Tags: