裁剪圖片對我們來說是再熟悉不過的了,最近工作中就又遇到了這個需求,所以想著乾脆整理下來,方法大家和自己在需要的時候參考學習,所以這篇文章主要介紹了利用Javascript裁剪圖片並儲存的簡單實現,後端PHP處理我用的是THINKPHP框架,需要的朋友可以參考下。
前言
就我而言,頁面上的設計比較靈動的部分,其實不是很多,諸如滑動驗證碼,圖片裁剪等比較好的互動設計。
從剛開始工作的時候,我就想把這些東西了解下,無奈一直沒這個需求,乘著今天的空閒,研究了一下午,期間遇到了大大小小的問題,一直備受折磨,這其實也反映一個問題,我的
還是比較薄弱。
實現效果:
使用者點擊上傳圖片後,頁面顯示所上傳的圖片,並且出現裁剪框和兩個預覽區域,最後點選裁剪按鈕將裁剪的圖片儲存到伺服器。
效果很簡單,整個過程我遇到的兩個困難,第一個是裁剪的JS效果,第二個則是圖片資料的處理。
對於第一個問題,我引用了網路上的一個插件,就我感覺來說,裁剪過程使用者的滿意度只能算一般,因為它只能裁剪正方形區域,就算邊框上有八個拉動設置,但是拉動框時還是按正方形縮放,就這點不太讓我滿意。
實作方法如下:
#以下是簡單的頁面設計:
<p style="float:left;"><img id="target"></p> <p style="width:48px;height:48px;margin:10px;overflow:hidden; float:left;"><img style="float:left;" id="preview" ></p> <p style="width:190px;height:195px;margin:10px;overflow:hidden; float:left;"><img style="float:left;" id="preview2" ></p> <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"}); // 限制了大小会影响到截图的效果 }; 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; //小头像预览p的大小 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; //大头像预览p的大小 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); }
這裡稍作兩點提醒:
其一:不要忘記在頁面頭部引入插件:
<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" />
其二:有些人眼尖的話可能看到了JS裡有個定時,同時心理是不是很疑惑這不是有點多此一舉嗎?其實不是,上傳圖片到JS加載到頁面上,是需要時間的,這個定時的意義在於
#等到圖片被JS加載到頁面上時才去加載裁剪效果,這裡也是反复實驗後得出的做法。
後端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); } }
這裡就是呼叫GD函式庫裡創建圖像的一系列方法,最重要就是imagecopy()
,它是將原圖按規定的裁剪位置,裁剪大小複製到新的圖片上去,這也說明了一件事,頁面使用者在裁剪圖片
的時候其實前端並沒有對圖片操作,而是得到裁剪時的座標位置,裁剪大小,然後提交到PHP操作! !
總結
#以上是使用Javascript裁剪圖片並儲存的簡單範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!