利用Javascript裁剪圖片并存儲(chǔ)的簡(jiǎn)單實(shí)現(xiàn)
前言
就我而言,頁(yè)面上的設(shè)計(jì)比較靈動(dòng)的部分,其實(shí)不是很多,諸如滑動(dòng)驗(yàn)證碼,圖片裁剪等比較好的交互設(shè)計(jì)。
從剛開(kāi)始工作的時(shí)候,我就想把這些東西了解下,無(wú)奈一直沒(méi)這個(gè)需求,乘著今天的空閑,研究了一下午,期間遇到了大大小小的問(wèn)題,一直備受折磨,這其實(shí)也反映一個(gè)問(wèn)題,我的
還是比較薄弱。
實(shí)現(xiàn)效果:
用戶(hù)點(diǎn)擊上傳圖片后,頁(yè)面顯示所上傳的圖片,并且出現(xiàn)裁剪框和兩個(gè)預(yù)覽區(qū)域,最后點(diǎn)擊裁剪按鈕保存裁剪的圖片到服務(wù)器上。
效果很簡(jiǎn)單,整個(gè)過(guò)程我遇到的兩個(gè)難點(diǎn),第一個(gè)是裁剪的JS效果,第二個(gè)則是圖片數(shù)據(jù)的處理。
對(duì)于第一個(gè)問(wèn)題,我引用了網(wǎng)上的一個(gè)插件,就我感覺(jué)來(lái)說(shuō),裁剪過(guò)程用戶(hù)的滿(mǎn)意度只能算一般,因?yàn)樗荒懿眉粽叫螀^(qū)域,就算邊框上有八個(gè)拉動(dòng)設(shè)置,但是拉動(dòng)框時(shí)還是按正方形縮放,就這點(diǎn)不太讓我滿(mǎn)意。
實(shí)現(xiàn)方法如下:
以下是簡(jiǎn)單的頁(yè)面設(shè)計(jì):
<div style="float:left;"><img id="target"></div> <div style="width:48px;height:48px;margin:10px;overflow:hidden; float:left;"><img style="float:left;" id="preview" ></div> <div style="width:190px;height:195px;margin:10px;overflow:hidden; float:left;"><img style="float:left;" id="preview2" ></div> <form action="{:U('/test/crop_deal')}" method="post" onsubmit="return checkCoords()" enctype="multipart/form-data" id="form"> <input type="file" name="file" onchange="change_image(this)"> <input type="hidden" id="x" name="x" /> <input type="hidden" id="y" name="y" /> <input type="hidden" id="w" name="w" /> <input type="hidden" id="h" name="h" /> <input type="submit" value="裁剪"/> </form>
下面是JS代碼:
function change_image(file){ var reader = new FileReader(); reader.onload = function(evt){ $("#target").attr('src',evt.target.result); $('#preview').attr('src',evt.target.result); $('#preview2').attr('src',evt.target.result); // $('#target').css({"height":"600px","width":"600px"}); // 限制了大小會(huì)影響到截圖的效果 }; reader.readAsDataURL(file.files[0]); var jcrop_api, boundx, boundy; setTimeout(function(){ $('#target').Jcrop({ minSize: [48,48], setSelect: [0,0,190,190], onChange: updatePreview, onSelect: updatePreview, onSelect: updateCoords, aspectRatio: 1 }, function(){ // Use the API to get the real image size var bounds = this.getBounds(); boundx = bounds[0]; boundy = bounds[1]; // Store the API in the jcrop_api variable jcrop_api = this; }); function updatePreview(c){ if (parseInt(c.w) > 0) { var rx = 48 / c.w; //小頭像預(yù)覽Div的大小 var ry = 48 / c.h; $('#preview').css({ width: Math.round(rx * boundx) + 'px', height: Math.round(ry * boundy) + 'px', marginLeft: '-' + Math.round(rx * c.x) + 'px', marginTop: '-' + Math.round(ry * c.y) + 'px' }); } { var rx = 199 / c.w; //大頭像預(yù)覽Div的大小 var ry = 199 / c.h; $('#preview2').css({ width: Math.round(rx * boundx) + 'px', height: Math.round(ry * boundy) + 'px', marginLeft: '-' + Math.round(rx * c.x) + 'px', marginTop: '-' + Math.round(ry * c.y) + 'px' }); } }; function updateCoords(c) { $('#x').val(c.x); $('#y').val(c.y); $('#w').val(c.w); $('#h').val(c.h); }; },500); }
這里稍作兩點(diǎn)提醒:
其一:不要忘記在頁(yè)面頭部引入插件:
<script src="/plug/js/jquery.min.js" type="text/javascript"></script> <script src="/plug/js/jquery.Jcrop.min.js" type="text/javascript"></script> <link rel="stylesheet" href="/plug/css/Jcrop.css" rel="external nofollow" type="text/css" />
其二:有些人眼尖的話(huà)可能看到了JS里有個(gè)定時(shí),同時(shí)心理是不是很疑惑這不是有點(diǎn)多此一舉嗎?其實(shí)不是,上傳圖片到JS加載到頁(yè)面上,是需要時(shí)間的,這個(gè)定時(shí)的意義在于
等到圖片被JS加載到頁(yè)面上時(shí)才去加載裁剪效果,這里也是反復(fù)實(shí)驗(yàn)后得出的做法。
后端PHP處理我用的是THINKPHP框架,版本是3.1.3
貼上代碼:
function crop_deal(){ ob_clean(); import ( 'ORG.Net.UploadFile' ); $upload = new UploadFile (); $upload->maxSize = 2000000; $upload->allowExts = array ( 'jpg', 'gif', 'png', 'jpeg' ); $upload->savePath = './upload/test/'; $upload->autoSub = true; $upload->subType = 'date'; $upload->dateFormat = 'Ymd'; if ($upload->upload () ) { $info = $upload->getUploadFileInfo(); $new_path = "./upload/test/thumb".date('Ymd'); $file_store = $new_path."/".date('YmdHis').".jpg"; if(!file_exists($new_path)){ mkdir($new_path,0777,true); } $source_path = "http://".$_SERVER['HTTP_HOST']."/upload/test/".$info[0]['savename']; $img_size = getimagesize($source_path); $width = $img_size[0]; $height = $img_size[1]; $mime = $img_size['mime']; $srcImg = imagecreatefromstring(file_get_contents($source_path)); $cropped_img = imagecreatetruecolor($_POST['w'], $_POST['h']); //縮放 // imagecopyresampled($cropped_img,$srcImg,0,0,$_POST['x'],$_POST['y'],$_POST['w'],$_POST['h'],$width,$height); //裁剪 imagecopy($cropped_img,$srcImg,0,0,$_POST['x'],$_POST['y'],$_POST['w'],$_POST['h']); header("Content-Type:image/jpeg"); imagejpeg($cropped_img,$file_store); imagedestroy($srcImg); imagedestroy($cropped_img); } }
這里就是調(diào)用GD庫(kù)里創(chuàng)建圖像的一系列方法,最重要就是imagecopy()
,它是將原圖按規(guī)定的裁剪位置,裁剪大小復(fù)制到新的圖片上去,這也說(shuō)明了一件事,頁(yè)面用戶(hù)在裁剪圖片
的時(shí)候其實(shí)前端并沒(méi)有對(duì)圖片操作,而是得到裁剪時(shí)的坐標(biāo)位置,裁剪大小,然后提交到PHP操作!!
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者使用Swift能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- js實(shí)現(xiàn)點(diǎn)擊后將文字或圖片復(fù)制到剪貼板的方法
- php+js實(shí)現(xiàn)圖片的上傳、裁剪、預(yù)覽、提交示例
- js+jquery實(shí)現(xiàn)圖片裁剪功能
- jquery imgareaselect 使用利用js與程序結(jié)合實(shí)現(xiàn)圖片剪切
- 使用JavaScript+canvas實(shí)現(xiàn)圖片裁剪
- 基于原生JS實(shí)現(xiàn)圖片裁剪
- javascript 圖片裁剪技巧解讀
- JS實(shí)現(xiàn)圖片剪裁并預(yù)覽效果
- 基于JavaScript實(shí)現(xiàn)圖片剪切效果
相關(guān)文章
Django1.7+JQuery+Ajax驗(yàn)證用戶(hù)注冊(cè)集成小例子
下面是散仙使用Django+Jquery+Ajax的方式來(lái)模擬實(shí)現(xiàn)了一個(gè)驗(yàn)證用戶(hù)注冊(cè)時(shí),用戶(hù)名存在不存在的一個(gè)小應(yīng)用。注意,驗(yàn)證存在不存在使用的是Ajax的方式,不用讓用戶(hù)點(diǎn)擊按鈕驗(yàn)證是否存在,需要的朋友可以參考下2017-04-04JavaScript設(shè)計(jì)模式之外觀(guān)模式實(shí)例
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之外觀(guān)模式實(shí)例,本文用一些代碼實(shí)例來(lái)講解JavaScript中的外觀(guān)模式,需要的朋友可以參考下2014-10-10基于JavaScript Array數(shù)組方法(新手必看篇)
下面小編就為大家?guī)?lái)一篇基于JavaScript Array數(shù)組方法(新手必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-08-08javascript實(shí)現(xiàn)簡(jiǎn)易計(jì)算器
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)簡(jiǎn)易計(jì)算器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02微信小程序?qū)崿F(xiàn)點(diǎn)擊按鈕修改view標(biāo)簽背景顏色功能示例【附demo源碼下載】
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)點(diǎn)擊按鈕修改view標(biāo)簽背景顏色功能,涉及微信小程序事件響應(yīng)及數(shù)值運(yùn)算實(shí)現(xiàn)動(dòng)態(tài)設(shè)置view背景色樣式的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12微信小程序地圖定位的實(shí)現(xiàn)方法實(shí)例
小程序功能的強(qiáng)大想必使用過(guò)的人都知道,下面這篇文章主要給大家介紹了關(guān)于微信小程序地圖定位的實(shí)現(xiàn)方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04javascript實(shí)現(xiàn)上傳圖片并預(yù)覽的效果實(shí)現(xiàn)代碼
圖片上傳預(yù)覽,就是在使用文件選擇框選擇了文件之后就可以在頁(yè)面上看見(jiàn)圖片的效果,關(guān)于這個(gè)效果我一直認(rèn)為是無(wú)法做到的2011-04-04使用微信小程序開(kāi)發(fā)彈出框應(yīng)用實(shí)例詳解
本文通過(guò)實(shí)例代碼給大家介紹了使用微信小程序開(kāi)發(fā)彈出框功能,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10