轉:canvas--放大鏡效果

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>鼠標事件</title>
</head>
<body>
<canvas id="canvas"></canvas>
<canvas id="offCanvas" style=" display: none;"></canvas>
<script>
?var canvas=document.getElementById('canvas')
?var context=canvas.getContext('2d')
?var offcanvas=document.getElementById('offCanvas')
?var offcontext=offcanvas.getContext('2d')?
?var image=new Image()
?//鼠標左鍵是否被點擊
?var isMouseDown=false;
?//定義縮放值
?var scale?
?window.οnlοad=function(){
? canvas.width="1030";
? canvas.height='750';
? image.src="timg.jpg"
? //圖片的原始尺寸要大于canvas的尺寸
? image.οnlοad=function(){
? offcanvas.width=image.width;
? offcanvas.height=image.height
? scale=offcanvas.width/canvas.width; ?
? context.drawImage(image,0,0,canvas.width,canvas.height);
? offcontext.drawImage(image,0,0)
? }
? //將屏幕的坐標轉換為在canvas的坐標
? function windowToCanvas(x,y){
? //獲取canvas距離瀏覽器周圍的left和top值
? var bbox=canvas.getBoundingClientRect();
?
? return {x:x-bbox.left,y:y-bbox.top}? ?
? }?
? //鼠標按下
? canvas.οnmοusedοwn=function(e){
? e.preventDefault(e);
? var point=windowToCanvas(e.clientX,e.clientY);
? //console.log('point.left'+point.x+','+e.clientX+','+e.clientY)
? ?? ?isMouseDown=true
? ?? ?//繪制放大鏡 當onmouseup、onmouseout時 drawcanvasWithMagnifier傳入false
? ?? ?drawcanvasWithMagnifier(true,point)? ?? ?? ?? ?
? }
? //鼠標移動
? canvas.οnmοusemοve=function(e){
? e.preventDefault(e);
? //需要查看鼠標的左鍵是否點擊著 如果沒有點擊則釋放放大鏡效果
? //isMouseDown為true時顯示放大鏡
? if(isMouseDown){
? var point=windowToCanvas(e.clientX,e.clientY);
? //console.log('point.left'+point.x+','+e.clientX+','+e.clientY)
? drawcanvasWithMagnifier(true,point)
? }
? }
? //鼠標松開
? canvas.οnmοuseup=function(e){
? e.preventDefault(e);
? isMouseDown=false;
? drawcanvasWithMagnifier(false)
? }
? //鼠標移開
? canvas.οnmοuseοut=function(e){
? e.preventDefault(e);
? isMouseDown=false;
? drawcanvasWithMagnifier(false)
? }
? function drawcanvasWithMagnifier(isMouseDown,point){
? context.clearRect(0,0,canvas.width,canvas.height)
? context.drawImage(image,0,0,canvas.width,canvas.height);
? if(isMouseDown){
? //繪制放大鏡】
? drawMagnifier(point)
? }
? }
? function drawMagnifier(point){
? //console.log('point.x'+point.x+'point.y'+point.y);
? //鼠標點擊的位置 計算出在放大圖像中的位置 ?計算出大圖的中心坐標
? var imageLG_cx=point.x*scale
? var imageLg_cy=point.y*scale
? //放大鏡顯示的大小 設置為200 放大鏡的半徑為200
? var mr=200
? //計算圓形的坐標和寬高
? var sx=imageLG_cx-mr;
? var sy=imageLg_cy-mr;
? //用戶可見的位置
? var dx=point.x-mr;
? var dy=point.y-mr;
? context.save()
? context.lineWidth=10.0;
? context.strokeStyle='#069'
? context.beginPath()
? //圓形剪輯
? context.arc(point.x,point.y,mr,0,Math.PI*2)
? context.stroke();
? context.clip();
? context.drawImage(offcanvas,sx,sy,2*mr,2*mr,dx,dy,2*mr,2*mr);
? context.restore()
? }?
?}
</script>
</body>
</html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247534.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247534.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247534.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MON

早上5點,咪咪牛就醒了,開始跳到我邊上,用白毛毛把我弄醒,在我身上走來走去,把她按住撫摸也不能讓她停止.....只能拎起來扔到邊上了 ;)看起來還的確是很調皮的貓咪呢昨天晚上就開始不太怕我了,走到我的椅子邊上喵喵叫,直到把她放在身上,才慢慢睡覺,滿可愛的早上出門叫車,一車正停…

CSS做個Switch開關

Switch開關&#xff1a;根據需求可知&#xff0c;Switch開關只有兩種選擇&#xff0c;true或false。所以我們想到HTML的checkbox控件&#xff0c;用它來做。  <input id"switch" type"checkbox" class"switch" />但是在瀏覽器中&#xf…

vue小記錄1

1.入口index.html文件 做reset.css初始化&#xff0c;視口viewport設置 2.規范化eslint配置&#xff08;常用&#xff09; &#xff08;1&#xff09;rules -->"semi"分號 "semi":[error,alway], &#xff08;2&#xff09;indent 空格 "inde…

解決虛擬機能ping通宿主機,而宿主機不能ping通虛擬機

解決虛擬機能ping通宿主機&#xff0c;而宿主機不能ping通虛擬機 首先&#xff0c;查看宿主機的網卡狀態 如果沒有&#xff0c;打開虛擬機&#xff0c;選擇編輯 打開虛擬網絡編輯器&#xff0c;并選擇更改設置 勾選將設備適配器連接此網絡 完成&#xff0c;這樣宿主機便可以pin…

mongo使用學習FAQ

1:mongo的集合和database區分大小寫么? 在 MongoDB 中&#xff0c;數據庫和集合的名稱是區分大小寫的。這意味著&#xff0c;數據庫 MyDatabase 和 mydatabase 或集合 MyCollection 和 mycollection 會被視為不同的數據庫或集合。因此&#xff0c;在操作數據庫和集合時&#…

前端下載的實現

前端很多項目中&#xff0c;都有文件下載的需求&#xff0c;特別是JS生成文件內容&#xff0c;然后讓瀏覽器執行下載操作&#xff08;例如在線圖片編輯、在線代碼編輯、iPresst等&#xff09;。但受限于瀏覽器&#xff0c;很多情況下我們都只能給出個鏈接&#xff0c;讓用戶點擊…

V記錄2(文檔)Vue.extend構造器

1.簡單介紹 Vue.extend(options) 參數&#xff1a;對象 用法&#xff1a;使用Vue構造器&#xff0c;創建一個“子類”&#xff0c;參數是一個包含組件選項的對象&#xff0c;其中,data選項中必須是函數 描述&#xff1a;Vue.extend返回的是一個“擴展實例構造器”&#xff0c;也…

在javascript中,如何判斷一個被多次encode 的url 已經被decode到原來的格式?

% 而不能被無限次decodeURIComponent 可以用%來進行判斷 轉載于:https://www.cnblogs.com/zhouyideboke/p/11169705.html

推薦base.css

學習《編寫高質量代碼--Web前端開發修煉之道》 /* CSS Document */ /*css reset*/ body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,textarea,p,blockquote,th,td{margin:0;padding:0;} table{ border-collapse:collapse;border-spacing:0;} fieldest,i…

如何通過RFID開發來迎接第四次工業革命(轉)

我們都經歷了革命性的沖擊&#xff0c;自上世紀90年代初的互聯網沖擊了文化和商業&#xff0c;但很少人知道如何完成RFID開發來迎接第四次工業革命&#xff0c;在接下來的二十年里&#xff0c;智能工廠的出現將成為一個重要組成部分。制造業作為我國工業的主體&#xff0c;面臨…

對js數組去重的研究

1.利用es5 let arr [1, 2, 3, 4, 5, 6, 7, 1, 2, 3] const uniquearr>{ return Array.from(new Set(arr)) } console.log(unique(arr))2.通過雙層循環使用splice刪除 let arr [1, 2, 3, 4, 5, 6, 7, 1, 2, 3] const uniquearr>{ // return Array.from(new Se…

一些前端開發經典書籍推薦和下載鏈接分享

下面的這些書都是我曾看過或了解過的&#xff1a; 一.HTML 1.《HTML5權威指南》 非常全面的書&#xff0c;內容也很新&#xff0c;包含了HTML5CSS3JS DOM。 下載鏈接&#xff1a;http://pan.baidu.com/s/1qYGn1qW HTML我暫時沒看什么書&#xff0c;學會了大部分的標簽后我…

RFID圖書管理系統程序源代碼(轉)

RFID圖書管理系統程序源代碼https://wenku.baidu.com/view/5f4e47f0c9d376eeaeaad1f34693daef5ef713d9.html

UOJ310 黎明前的巧克力 FWT

傳送門 我們要求的是\([x^0]\prod\limits_{i1}^n (2x^{a_i}1)\)&#xff0c;其中乘積定義為集合對稱差卷積。 這個直接做復雜度太高了&#xff0c;考慮優化。注意到在FWT之后&#xff0c;每一個序列中的值要么是\(3\)&#xff0c;要么是\(-1\)&#xff0c;而且這個只跟\(a_i\)有…

vue調用百度地圖API

安裝 $ npm install vue-baidu-map --save 全局注冊 在main.js 里面引入以下代碼 import BaiduMap from vue-baidu-mapVue.use(BaiduMap, {ak: 百度地圖密鑰AK }) 使用方法 <doc-preview><baidu-map class"map" style"display: flex; flex-direct…

mysql show processlist命令 詳解

SHOW PROCESSLIST顯示哪些線程正在運行。您也可以使用mysqladmin processlist語句得到此信息。如果您有SUPER權限&#xff0c;您可以看到所有線程。否則&#xff0c;您只能看到您自己的線程&#xff08;也就是&#xff0c;與您正在使用的MySQL賬戶相關的線程&#xff09;。請參…

JS 數據處理技巧及小算法匯總(轉載)

1、根據屬性來更新一個數組中的對象 const arr [ {id: 1, score: 1}, {id: 2, score: 2}, {id: 3, score: 4}]; //更新的值 const newValue {id: 3, score: 3} 更新數組中id為3的score值。 Es6 裝逼寫法如下&#xff1a; const result initial.map(x > x.id newValue.i…

讓行內元素(如圖片)在div中水平垂直居中 (干貨)

&#xff08;1&#xff09;第一種&#xff1a;用vertical-align <div class"method1"><span class"tiptop"></span><img class"test" src"img/Dota2.jpg" alt"dota2"> </div><style> …

對Canvas的研究

1。標簽定義圖形&#xff0c;比如圖表和其他圖像&#xff0c;您必須使用腳本來繪制圖形。 什么是 canvas? HTML5 <canvas> 元素用于圖形的繪制&#xff0c;通過腳本 (通常是JavaScript)來完成. <canvas> 標簽只是圖形容器&#xff0c;您必須使用腳本來繪制圖形。 …

Vue中watch的簡單應用

Vue.js 有一個方法 watch&#xff0c;它可以用來監測Vue實例上的數據變動。 如果對應一個對象&#xff0c;鍵是觀察表達式&#xff0c;值是對應回調&#xff0c;值也可以是方法名&#xff0c;或者是對象&#xff0c;包含選項。 下面寫兩個demo&#xff0c;參考demo來了解一下 …