pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

HTML5自助切圖

HTML5自助切圖   三聯教程

  享受生活,熱愛重構,大家好,我是Json。

  在現在這個到處是HTML5話題的時代,好像不懂點HTML5都有點落伍。那我也跟上潮流一把吧,今天給大家分享的是基于HTML5的自助切圖。

  在組里經常會被某設計師叫切板仔,確實重構很大一部分工作都花在切圖上,而如何提高切圖效率或者讓切圖自助化也是我們重構師的追求。基于這個前提我自己抱著研究的心態,使用HTML5大致實現了一下。一開始覺得HTML5是個很神秘很高深的東西,其實當你去了解他,你會發現他是很空虛,且很容易上…………….手的。

  這里使用到的HTML5技術包括:

  本地預覽(FileReader)

  拖拽(drag & drop)

  切圖(canvas)

  拖拽:

  拖拽基本事件如下:

DataTransfer 對象 退拽對象用來傳遞的媒介,使用一般為Event.dataTransfer。
draggable 屬性 就是標簽元素要設置draggable=true,否則不會有效果,例如: <div title=”拖拽我” draggable=”true”&rt;列表1</div:rt;</td&rt;
ondragstart 事件 當拖拽元素開始被拖拽的時候觸發的事件,此事件作用在被拖曳元素上
ondragenter 事件 當拖曳元素進入目標元素的時候觸發的事件,此事件作用在目標元素上
ondragover 事件 拖拽元素在目標元素上移動的時候觸發的事件,此事件作用在目標元素上
ondrop 事件 被拖拽的元素在目標元素上同時鼠標放開觸發的事件,此事件作用在目標元素上
ondragend 事件 當拖拽完成后觸發的事件,此事件作用在被拖曳元素上
drageleave事件 當拖拽離開此處時觸發,只在離開這個對象時觸發一次,此事件作用在目標元素上
Event.preventDefault() 方法 阻止默認的些事件方法等執行。在ondragover中一定要執行preventDefault(),否則ondrop事件不會被觸發。另外,如果是從其他應用軟件或是文件中拖東西進來,尤其是圖片的時候,默認的動作是顯示這個圖片或是相關信息,并不是真的執行drop。此時需要用用document的ondragover事件把它直接干掉。
Event.effectAllowed 屬性 就是拖拽的效果。

  圖1是頁面上所使用到拖拽的地方。左圖為拖拽上傳圖片,右圖為拖拽參考線。

  介紹完拖拽基本事件后,再來看下頁面是如何通過拖拽將本地圖片通過拖拽的方式拖到頁面指定區域使用圖片上傳,這也是拖拽現在比較常用到的功能。

  給document增加拖拽事件,當拖拽元素進入頁面時改變目標元素樣式提示用戶目標元素位置,當拖拽元素離開頁面后還原樣式。代碼如下:

  document.ondragleave = function(e){

  e.preventDefault();

  var el = document.getElementById('target_box');

  el.className = el.className.replace(/over/g,'');

  }

  document.ondrop = function(e){

  e.preventDefault();

  }

  document.ondragenter = function(e){

  e.preventDefault();

  var el = document.getElementById('target_box');

  el.className = el.className + ' over';

  }

  document.ondragover = function(e){

  e.preventDefault();

  var el = document.getElementById('target_box');

  el.className = el.className + ' over';

  }

  當圖片被拖到上傳區域后通過FileReader方法讀取本地文件,然后將圖片通過canvas來繪制,如果圖片的寬度是大于畫布1000px將水平居中處理,這里因為切圖的時候需要將圖片完整切出來,所以在設置canvas寬度時需要顯示成圖片的大小,所以這里使用了負marginLeft(這里將圖片寬度減1000得出超出1000的區域,然后再除于2得出marginLeft的值)外面套一層1000px的方式來實現水平居中。代碼如下:

  var box = document.getElementById('target_box');

  box.ondrop = function(e){

  e.preventDefault();

  //獲取文件列表

  var fileList = e.dataTransfer.files;

  var reader = new FileReader();

  reader.onload = function(e){

  var img = new Image();

  img.src = this.result;

  img.onload = function(){

  if(this.width>1000){

  canvas.style.marginLeft = ((this.width - 1000)/2) * -1 + 'px';

  }

  canvas.width = this.width;

  canvas.height = this.height;

  ctx.drawImage(this,0,0);

  }

  }

  reader.readAsDataURL(fileList[0]);

  document.getElementById('target_box').style.display = 'none';

  document.getElementById('doc').style.display = 'display';

  };

  本地預覽(FileReader)

FileReader接口的方法
readAsBinaryString(file) 將文件讀取二進制碼
通常我們將它傳送到后端,后端可以通過這段字符串存儲文件
readAsText(file,[encoding]) 將文件讀取文本
第二個參數是文本的編碼方式,默認UTF-8
readAsDataURL(file) 將文件讀取為DataURL
將文件讀取為一串Data URL字符串,將小文件以一種特殊格式的URL地址直接讀入頁面。小文件指圖像與html等格式的文件。
FileReader接口的事件
onabort 數據讀取中斷時觸發
onerror 數據讀取出錯時觸發
onloadstart 數據讀取開始時觸發
onprocess 數據讀取中
onload 數據讀取成功完成時觸發
onloadend 數據讀取完成時觸發,無論成功失敗

  這里因為標尺不需要做任何事情處理只需要拖拽效果,所以只需要增加draggable屬性就可以,代碼如下:

  然后給目標元素增加Drop事件,當拖拽的標尺在目標元素上放開時新建一個參考線并通過offsetY來獲取鼠標釋放時的Y坐標,然后再將這個Y坐標存到數組里。

  //增加標尺目標事件

  document.getElementById('cvs').ondrop = function(ev){

  var div = document.createElement('div');

  div.style.width = '100%'

  div.style.height = '1px';

  div.style.background = '#4affff';

  div.style.position = 'absolute'

  div.style.top = ev.offsetY + 18 + 'px';

  document.getElementById('screen').appendChild(div);

  rulerTop.push(ev.offsetY);

  return false;

  }

  Canvas:

  這里先介紹下canvas的drawImage方法,切圖的核心方法就是這個,我們先來看看官方給出的使用方法與解釋:

  drawImage(image, sourceX, sourceY, sourceWidth, sourceHeight, destX, destY, destWidth, destHeight)

image 所要繪制的圖像。這必須是表示 #FormatImgID_3# 標記或者屏幕外圖像的 Image 對象,或者是 Canvas 元素。
sourceX, sourceY 圖像將要被繪制的區域的左上角。這些整數參數用圖像像素來度量。
sourceWidth, sourceHeight 圖像所要繪制區域的大小,用圖像像素表示。
destX, destY 所要繪制的圖像區域的左上角的畫布坐標。
destWidth, destHeight 圖像區域所要繪制的畫布大小。

  了解了drawImage方法后我們來看下,如何通過drawImage達到切圖效果,其實這里的切圖,只是通過drawImage加上高寬和偏移量來實現所謂的切圖效果,代碼如下:

  //繪制圖片

  function scaleCanvas (canvas, width, height, destX, destY) {

  var w = canvas.width,

  h = canvas.height;

  var cutCanvas = document.createElement('canvas');

  var cutCtx = cutCanvas.getContext('2d');

  cutCanvas.width = width;

  cutCanvas.height = height;

  cutCtx.drawImage(canvas, 0, 0, w, h, destX, destY, w, h);

  return cutCanvas;

  }

  //獲取圖片URL

  function getDataURL (canvas, width, height, destX, destY) {

  canvas = scaleCanvas(canvas, width, height, destX, destY);

  return canvas.toDataURL('image/jpeg');

  }

  //將conver轉成IMG格式

  var convertToImage = function (canvas, width, height, destX, destY) {

  var strData = getDataURL(canvas, width, height, destX, destY);

  return encodeURIComponent(strData);

  }

  這里先說下大致實現的原理,首先先創建一個新的canvas然后設置好寬高,而這個寬高就是參考線分隔的每一塊寬高,然后過通drawImage將原圖上某塊局域復制一份出來,再通過toDataURL轉成base64編碼方便本地顯示。

  所在在這個Demo中image就是我們剛上傳的那個圖片,sourceX、sourceY和destWidth、destHeight取圖片的原始高寬,而我們要復制的局域也是從新的canvas上的左上角開始,所以這里的sourceX、sourceY為0,0。這里最主要的就是destX、destY,就是他們來控制復制局域的起始坐標,因為新圖片是需要從最左邊開始復制,所以destX為0,而destY將根據參考線的縱坐標來定值。

  這里要注意一下,因為域的問題,所以如果頁面不是放到服務器上運行而是本地運行的話會出現權限報錯情況

  最后附上Demo一枚,歡迎大家盡情的暴、使勁暴。(Demo只支持chrome瀏覽器,其他瀏覽器會有不良反應,請見諒)

  好了,整個HTML5自助化切圖的主要代碼就這些,這里第一次嘗試用HTML5去做一些實實在在的東西,可能代碼并不是最優,還能繼續優化,大家如果對于文章有什么建議或不明白的地方歡迎討論。

  在舊版的切圖工具里,我們的做法是將圖片上傳到服務器,然后通過服務器端把圖片切好后把對應的地址返回,前端再把頁面顯示出來。這樣的做法會導致在網絡慢時出現長時間的等待,而如果頁面放棄這里的操作,還需要將圖片從服務器端刪除掉。在拖拽參考線時也只能通過大量的代碼去實現,還需要編寫一些服務器端代碼。

  HTML5版相對有響應速度快(本地讀取)、拖拽功能簡單、前端切圖不需要依賴服務器,減少開發成本。

  反正HTML5是個上流、好玩、有趣、簡單的好東西,值得你一生擁有。

  寫完文章已經凌晨兩點半,根據官方和非官方統計,這個時間段被坑機率是平時的0.000001%,實踐是檢驗真理的唯一標準。而為了檢驗這個標準我帶著疲憊的身軀,打開客戶端進入匹配模式。

  裸多蘭一級升E下路孤獨神級大嘴再次上路,德瑪西亞。。。

        :更多精彩教程請關注三聯網頁設計教程 欄目,

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章主要介紹了有關HTML5頁面在iPhoneX適配問題,需要的朋友可以參考下
本篇文章主要介紹了html5中canvas圖表實現柱狀圖的示例,本文使用canvas來實現一個圖表,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
Adobe公司出品的多媒體處理軟件產品線較多,涵蓋了音視頻編輯、圖像處理、平面設計、影視后期等領域。這篇文章主要介紹了Adobe Html5 Extension開發初體驗圖文教程,非常不錯,需要的朋
這篇文章主要介紹了基于HTML5的WebGL經典3D虛擬機房漫游動畫,需要的朋友可以參考下
這篇文章主要介紹了手機端用rem+scss做適配的詳解,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
本篇文章主要介紹了canvas 實現 github404動態效果的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
主站蜘蛛池模板: 电缆接头-防爆电缆接头-格兰头-金属电缆接头-防爆填料函 | 游泳池设备安装工程_恒温泳池设备_儿童游泳池设备厂家_游泳池水处理设备-东莞市君达泳池设备有限公司 | EDLC超级法拉电容器_LIC锂离子超级电容_超级电容模组_软包单体电容电池_轴向薄膜电力电容器_深圳佳名兴电容有限公司_JMX专注中高端品牌电容生产厂家 | 济宁工业提升门|济宁电动防火门|济宁快速堆积门-济宁市统一电动门有限公司 | 苏州西装定制-西服定制厂家-职业装定制厂家-尺品服饰西装定做公司 | 深圳律师咨询_深圳律师事务所_华荣【免费在线法律咨询】网 | 淄博不锈钢,淄博不锈钢管,淄博不锈钢板-山东振远合金科技有限公司 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 地埋式垃圾站厂家【佳星环保】小区压缩垃圾中转站转运站 | 深圳展厅设计_企业展馆设计_展厅设计公司_数字展厅设计_深圳百艺堂 | 学校用栓剂模,玻璃瓶轧盖钳,小型安瓿熔封机,实验室安瓿熔封机-长沙中亚制药设备有限公司 | 儋州在线-儋州招聘找工作、找房子、找对象,儋州综合生活信息门户! | 德国进口电锅炉_商用电热水器_壁挂炉_电采暖器_电热锅炉[德国宝] | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 防水套管-柔性防水套管-刚性防水套管-上海执品管件有限公司 | 锤式粉碎机,医药粉碎机,锥式粉碎机-无锡市迪麦森机械制造有限公司 | 桐城新闻网—桐城市融媒体中心主办| 石栏杆_青石栏杆_汉白玉栏杆_花岗岩栏杆 - 【石雕之乡】点石石雕石材厂 | 萃取箱-萃取槽-PVC萃取箱厂家-混合澄清槽- 杭州南方化工设备 | UV-1800紫外光度计-紫外可见光度计厂家-翱艺仪器(上海)有限公司 | 泰安塞纳春天装饰公司【网站】 | 神超官网_焊接圆锯片_高速钢锯片_硬质合金锯片_浙江神超锯业制造有限公司 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 浙江自考_浙江自学考试网| 首页-瓜尔胶系列-化工单体系列-油田压裂助剂-瓜尔胶厂家-山东广浦生物科技有限公司 | 400电话_400电话申请_888元包年_400电话办理服务中心_400VIP网 | 篷房|仓储篷房|铝合金篷房|体育篷房|篷房厂家-华烨建筑科技官网 知名电动蝶阀,电动球阀,气动蝶阀,气动球阀生产厂家|价格透明-【固菲阀门官网】 | 六自由度平台_六自由度运动平台_三自由度摇摆台—南京全控科技 | KBX-220倾斜开关|KBW-220P/L跑偏开关|拉绳开关|DHJY-I隔爆打滑开关|溜槽堵塞开关|欠速开关|声光报警器-山东卓信有限公司 | 顶空进样器-吹扫捕集仪-热脱附仪-二次热解吸仪-北京华盛谱信仪器 | 超声波破碎仪-均质乳化机(供应杭州,上海,北京,广州,深圳,成都等地)-上海沪析实业有限公司 | 非甲烷总烃分析仪|环控百科| 无尘烘箱_洁净烤箱_真空无氧烤箱_半导体烤箱_电子防潮柜-深圳市怡和兴机电 | 智能家居全屋智能系统多少钱一套-小米全套价格、装修方案 | 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | 爱佩恒温恒湿测试箱|高低温实验箱|高低温冲击试验箱|冷热冲击试验箱-您身边的模拟环境试验设备技术专家-合作热线:400-6727-800-广东爱佩试验设备有限公司 | 深圳宣传片制作_产品视频制作_深圳3D动画制作公司_深圳短视频拍摄-深圳市西典映画传媒有限公司 | 广西资质代办_建筑资质代办_南宁资质代办理_新办、增项、升级-正明集团 | 浙江栓钉_焊钉_剪力钉厂家批发_杭州八建五金制造有限公司 | SMC-ASCO-CKD气缸-FESTO-MAC电磁阀-上海天筹自动化设备官网 | 施工电梯_齿条货梯_烟囱电梯_物料提升机-河南大诚机械制造有限公司 |