【gd库抠图 php】

*@param int $maxWidth 照片被放缩后的最大宽度 *@param int $maxHeight 照片被放缩后的最大高宽比 *@param string $pre 放缩后的照片名前缀,默认设置为"s_" *@return boolen 回到布尔运算值表明取得成功与否。 function imageResize($picname,$path,$maxWidth,$maxHeight,$pre="s_"){ $path = rtrim($path,"/")."/"; //1获得被放缩的照片信息内容 $info = getimagesize($path.$picname); //获得照片的宽和高 $width = $info[0]; $height = $info[1]; //2依据照片种类,应用对应的涵数建立画布源。 switch($info[2]){ case 1: //gif文件格式 $srcim = imagecreatefromgif($path.$picname); break; case 2: //jpeg文件格式 $srcim = imagecreatefromjpeg($path.$picname); break; case 3: //png文件格式 $srcim = imagecreatefrompng($path.$picname); break; default: return false; //die("失效的照片文件格式"); break; //3. 测算放缩后的照片规格 if($maxWidth/$width $maxHeight/$height){ $w = $maxWidth; $h = ($maxWidth/$width)*$height; }else{ $w = ($maxHeight/$height)*$width; $h = $maxHeight; //4. 建立总体目标画布 $dstim = imagecreatetruecolor($w,$h); //5. 刚开始美术绘画(开展照片放缩) imagecopyresampled($dstim,$srcim,0,0,0,0,$w,$h,$width,$height); //6. 輸出图象另存为 switch($info[2]){ case 1: //gif文件格式 imagegif($dstim,$path.$pre.$picname); break; case 2: //jpeg文件格式 imagejpeg($dstim,$path.$pre.$picname); break; case 3: //png文件格式 imagepng($dstim,$path.$pre.$picname); break;
function pngMerge($o_pic,$out_pic){ $begin_r = 255; $begin_g = 250; $begin_b = 250; list($src_w, $src_h) = getimagesize($o_pic);// 获得原图象信息内容 宽高 $src_im = imagecreatefrompng($o_pic);...
list($src_w, $src_h) = getimagesize($o_pic);// 获得原图象信息内容 宽高 $src_im = imagecreatefrompng($o_pic); //载入png照片 print_r($src_im); imagesavealpha($src_im,true);//这里很关键 意思是不必丢了$src_im图象的全透明色 $src_white = imagecolorallocatealpha($src_im, 255, 255, 255,127); // 建立1副白色全透明的画布 for ($x = 0; $x $src_w; $x++) { for ($y = 0; $y $src_h; $y++) { $rgb = imagecolorat($src_im, $x, $y); $r = ($rgb 16) 0xFF; $g = ($rgb 8) 0xFF; $b = $rgb 0xFF; if($r==255 $g==255 $b == 255){ imagefill($src_im,$x, $y, $src_white); //填充某个点的色调 imagecolortransparent($src_im, $src_white); //将原图色调更换为全透明色 if (!($r = $begin_r $g = $begin_g $b = $begin_b)) { imagefill($src_im, $x, $y, $src_white);//更换成白色 imagecolortransparent($src_im, $src_white); //将原图色调更换为全透明色
imagealphablending($target_im,false);//这里很关键,意思是不符合并色调,立即用$target_im图象色调更换,包含全透明色; imagesavealpha($target_im,true);//这里很关键,意思是不必丢了$target_im图象的全透明色; $tag_white = imagecolorallocatealpha($target_im, 255, 255, 255,127);//把转化成新图的白色改成全透明色 存为tag_white imagefill($target_im, 0, 0, $tag_white);//在总体目标新图填充空白色 imagecolortransparent($target_im, $tag_white);//更换成全透明色 imagecopymerge($target_im, $src_im, 0, 0, 0, 0, $src_w, $src_h, 100);//合拼原图和新生儿成的全透明图 imagepng($target_im,$out_pic); return $out_pic;
第1种方式 ?php function createImg($srcFile) { $data = getimagesize($srcFile); switch ($data['2']) { case 1: $im = imagecreatefromgif($srcFile); break; ...
* @param source $srcImg GD照片資源 * @param integer $radius 圆角尺寸 = 最短边的长度 / $radius function roundImgs($srcImg, $radius=2) { $w = imagesx($srcImg); $h = imagesy($srcImg); $radius = min($w, $h) / $radius; $img = imagecreatetruecolor($w, $h); imagesavealpha($img, true); // 设定全透明安全通道 $bg = imagecolorallocatealpha($img, 255, 255, 255, 127); // 拾取1个彻底全透明的色调, 最终1个主要参数127为透明 imagefill($img, 0, 0, $bg); $r = $radius; // 圆 角半径 for ($x = 0; $x $x++) { for ($y = 0; $y $y++) { $rgbColor = imagecolorat($srcImg, $x, $y); if (($x = $radius $x = ($w - $radius)) || ($y = $radius $y = ($h - $radius))) { imagesetpixel($img, $x, $y, $rgbColor); // 不在4角的范畴内,立即画 } else { // 在4角的范畴内挑选画 // 上左 $yx = $r; // 圆心X座标 $yy = $r; // 圆心Y座标 if (((($x - $yx) * ($x - $yx) + ($y - $yy) * ($y - $yy)) = ($r * $r))) { imagesetpixel($img, $x, $y, $rgbColor); // 上右 $yx = $w - $r; // 圆心X座标 $yy = $r; // 圆心Y座标 if (((($x - $yx) * ($x - $yx) + ($y - $yy) * ($y - $yy)) = ($r * $r))) { imagesetpixel($img, $x, $y, $rgbColor); // 下左 $yx = $r; // 圆心X座标 $yy = $h - $r; // 圆心Y座标 if (((($x - $yx) * ($x - $yx) + ($y - $yy) * ($y - $yy)) = ($r * $r))) { imagesetpixel($img, $x, $y, $rgbColor); // 下右 $yx = $w - $r; // 圆心X座标 $yy = $h - $r; // 圆心Y座标 if (((($x - $yx) * ($x - $yx) + ($y - $yy) * ($y - $yy)) = ($r * $r))) { imagesetpixel($img, $x, $y, $rgbColor); return $img; function cropImg($img, $axisx, $axisy) { $width = imagesx($img); $height = imagesy($img); $setRatio = $axisx / $axisy; $curRatio = $width / $height; if ($setRatio $curRatio) { $resizeX = $width; $resizeY = $resizeX * $axisy / $axisx; $x = 0; $y = ($height - $resizeY) / 2; } elseif ($setRatio $curRatio) { $resizeY = $height; $resizeX = $resizeY * $axisx / $axisy; $x = ($width - $resizeX) / 2; $y = 0; } else { $resizeX = $width; $resizeY = $height; $x = $y = 0; $im = imagecreatetruecolor($resampleX, $resampleY); imagecopyresampled($im, $img, 0, 0, $x, $y, $resampleX, $resampleY, $resampleX, $resampleY); imagedestroy($img); return $im; $url = 'https://upload-images.jianshu.io/upload_images/8396841⑻29819a83d4a77e4.jpg'; $img = createImg($url); // 建立GD图象資源 $img = cropImg($img, 1, 1); // 以便美观大方垂直居中剪裁成正方形 $img = roundImgs($img); // 将4个角画成全透明的 imagepng($img, './roundBirds.png'); imagedestroy($img);

             原图 =                                      剪裁后 = 


第2种方式:应用PHP Imagick库开展照片圆角解决,Imagick是自带的照片圆角解决,在实行高效率上也比GD的要胜上1筹。


$image- roundCorners($width/2, $height/2); $saveName = $saveName ? : substr(md5(time()), 0, 5).'.png'; $image- writeImage($saveName); $image- destroy(); }

第3种方式:应用PHP GD库开展解决。速率:快。缺陷:imagecopyresampled时全透明一部分会失真,要放缩只能用imagecopyresesize

 * 解决圆角照片
 * @param srting $imgpath 源照片的相对路径
 * @return [type] [description]
function roundedCorners($imgpath){
 list($width,$height,$type) = getimagesize($imgpath);//获得提交照片尺寸
 if ($width != $height) {//假如提交照片并不是正方形,取最少宽度做为最后转化成图的尺寸
 if ($width $height) {
 $imsize = $height;
 } else {
 $imsize = $width;
 $im = imagecreatetruecolor($imsize, $imsize);//这里建立第1个图象
 $white = imagecolorallocate($im, 255, 255, 255);// 随意取两个色调,这里取黑色和白色
 $black = imagecolorallocate($im, 0, 0, 0);
 imagefill($im, 0, 0, $white);//将照片填充为白色
 imagefilledellipse($im, $imsize/2, $imsize/2, $imsize, $imsize, $black);//随后再照片正中间画1个黑色的圆
 imagecolortransparent($im, $black);//将黑色设为全透明的,则如今4个角是白色的,随后正中间是全透明的
 switch ($type) {
 case '2':
 $img = imagecreatefromjpeg($imgpath);//这里建立的是第2个图象
 break;
 default:
 $img = imagecreatefrompng($imgpath);//这里建立的是第2个图象
 break;
 $final = imagecreatetruecolor($imsize, $imsize);//再建立1个图象,第3个图象
 imagecopyresampled($final, $img, 0, 0, ($width-$imsize)/2, ($height-$imsize)/2, $imsize, $imsize, $imsize, $imsize);//先将第2个图象(照片)压在空白的图象上,依据最少宽度,垂直居中剪裁,变成第4个图象
 imagecopymerge($final, $im, 0, 0, 0, 0, $imsize, $imsize, 100);//再将第1个图象压在第4个图象上,因为正中间是全透明的,因此如今图象上正中间是照片,4个角全是白色的,第5个图
 imagecolortransparent($im, $white);//随后将白色设定为全透明的,如今这个图4个角是全透明的,随后正中间是黑色的
 imagecopymerge($im, $final, 0, 0, 0, 0, $imsize, $imsize, 100);//将第5个图压在最终的图象上,便可以获得最终的圆形的图了
 return $im;//回到照片
}

要剪裁不规律图型则必须依靠此外的照片来进行每日任务。必须依靠2值图做为模版图,或得出的模版照片上,要抠出来的一部分须为不全透明的,要去掉的一部分则为全透明的,传入模版照片和初始照片详细地址,回到1个照片資源。


function cropImgByTemplate($templateImgUrl, $userImgUrl) { list($w, $h) = getimagesize($userImgUrl); $uimg = createImg($userImgUrl); $tempImg = imagecreatefrompng($templateImgUrl); list($width,$height) = getimagesize($templateImgUrl); $uim = imagecreatetruecolor($width, $height); // 将客户照片的规格尺寸放缩到模版的尺寸便捷剪裁 imagecopyresampled($uim, $uimg, 0, 0, 0, 0, $width, $height, $w, $h); $img = imagecreatetruecolor($width, $height); // 建立1个底图,尺寸和模版1致 imagesavealpha($img, true); // 设定alpha安全通道为true,显示信息全透明一部分 $bg = imagecolorallocatealpha($img, 255, 255, 255, 127); // 摄入1个全透明的色调 imagefill($img, 0, 0, $bg); // 将全透明色调铺满底图,获得1张透明的照片 for ($i=0; $i $width; $i++) { // 遍历照片的像素点 for ($j=0; $j $height; $j++) { $rgb = imagecolorat($tempImg, $i, $j); // 获得模版上某个点的色值 if (!$rgb) { // 并不是全透明的 $color = imagecolorat($uim, $i, $j); // 在客户的照片上对应的地区取色值 imagesetpixel($img, $i, $j, $color); // 在全透明底图上画出要剪裁出来的一部分 return $img; $tempUrl = 'https://upload-images.jianshu.io/upload_images/8396841⑸0c151628048a0cf.png'; $url = 'https://upload-images.jianshu.io/upload_images/8396841⑻29819a83d4a77e4.jpg'; $img = cropImgByTemplate($tempUrl, $url); imagepng($img, './test.png'); imagedestroy($img);

模版图==   原图 ==      剪裁后 == 

收起 进行全文
根据1次试验检测,自己发现wince程序流程中涵数TransparentImage,实际主要参数以下:BOOL TransparentImage( HDC hdcDest, LONG DstX, LONG DstY, LONG DstCx, LONG DstCy, HANDLE hSrc, LONG SrcX, ...

根据1次试验检测,自己发现wince程序流程中涵数TransparentImage,实际主要参数以下:

BOOL TransparentImage(
 HDC hdcDest, 
 LONG DstX, 
 LONG DstY, 
 LONG DstCx, 
 LONG DstCy,
 HANDLE hSrc, 
 LONG SrcX, 
 LONG SrcY, 
 LONG SrcCx, 
 LONG SrcCy, 
 COLORREF TransparentColor
);
在其中的TransparentColor不可以为COLORREF color=RGB(0,0,0);也便是说不可以为黑色,自己亲测,发现当设定黑色的情况下,全透明色(黑色),并沒有实际效果。因此提议能够将照片无法显示的其余一部分用ps所有涂成鲜红色,随后将全透明色设定成鲜红色,也便是COLORREF color=RGB(255,0,0);这样便可以很好的显示信息全透明实际效果,即所谓的“抠图”实际效果。

备注:本人工作能力水平比较有限,如上述有错欢迎指责纠正。此外,转载请标出出处https://blog.csdn.net/u013237982/article/details/46661025

收起 进行全文
关键的完成分为两一部分,1一部分是前端开发运用js开展剪裁地区挑选,第2一部分是运用PHP开展后台管理解决。 作用 因为自己的js水平比较有限,因此今日所说的照片剪裁不具备很强劲的作用。假如,您要想更为强劲的作用可使用JCrop...
序言

近期在给1个新项目加上照片编写作用。要开展照片编写,最关键要可以对照片开展剪裁。这是1个很成心思的作用,我花了1天的時间写了1个简易的照片剪裁的作用。如今就跟大伙儿共享1下。

关键的完成分为两一部分,1一部分是前端开发运用js开展剪裁地区挑选,第2一部分是运用PHP开展后台管理解决。

因为自己的js水平比较有限,因此今日所说的照片剪裁不具备很强劲的作用。假如,您要想更为强劲的作用可使用JCrop软件,这个软件是1个强劲的照片剪裁软件,UI也很好看。免费下载详细地址本文最终会贴出。

下面是我自身写的照片剪裁的作用详细介绍:

能够运用电脑鼠标拖拖拉拉,造成剪裁框 能够更改剪裁框尺寸 点一下明确,回到剪裁数据信息

进行剪裁的方式有两种:

1、运用HTML5新增拖拽恶性事件drag drop等 2、传统式方式,运用电脑鼠标恶性事件,mousedown、mousemove等

在这里,大家选用方式2。

剪裁地区的产生

要开展剪裁最先要产生剪裁地区,这个剪裁地区的产生大家能够与电脑鼠标挪动的间距有关联。电脑鼠标挪动多远,剪裁地区就有多大。以下图:

如上图所示电脑鼠标的横向挪动间距与纵向挪动间距相互构成了剪裁地区的宽和高。

而这横向与纵向挪动的间距怎样测算呢?当大家点下电脑鼠标时,就可以够根据event恶性事件目标获得电脑鼠标点一下部位,而挪动电脑鼠标时,也可以根据event获得电脑鼠标的部位,根据两次电脑鼠标部位的更改,就可以够得到电脑鼠标的挪动间距。

获得电脑鼠标部位的特性是clientX和clientY

黑影地区的产生

接下来便是绘图黑影地区。被剪裁照片中除剪裁地区之外的一部分,都属于黑影一部分,还可以不绘图该地区,绘图该地区是以便让客户更清楚的看清剪裁地区。

我将该地区分为了左右上下4个一部分,见下图遍布:

那末该地区假如测算呢?这时候就要用到Dom元素的偏位值了,运用剪裁地区的左偏位值减去照片自身的左偏位值便是左黑影的宽,运用剪裁地区的上偏位值减去照片的上偏位值,等于上黑影的高宽比值。以下图:

获得到左黑影、上黑影的值后,就可以够根据这两个将别的黑影的特性测算出来。

照片的偏位值有两种取法

运用offsetLeft 与 offsetTop 值 缺点 假如dom元素有border margin等价会将这些值测算在内 获得dom的css特性 缺点 预订义的css相关 假如没界定left top就没法获得

这两种方式都有各有的缺点,视不一样状况来应用

剪裁越界的阻拦

剪裁地区的测算是根据电脑鼠标的挪动间距来测算的,因而会出現剪裁地区越界的状况,而这状况又分为两种:

剪裁全过程中越界 挪动剪裁地区时越界

那末下面就来讲说怎样避免越界。

甚么是剪裁时越界?便是电脑鼠标拖拽地区超过了照片的回到,产生了越界,以下图:

针对这类越界必须分辨剪裁地区的右边相对访问器左边的部位 不可以够超出 照片右边的部位非常于访问器左边的部位;另外剪裁地区底部相对访问器顶位置置 不可以够超出 照片底部相对性应访问器顶部的部位。還是画图来讲明:

当TX = PX 时就让TX的值强制性为1固定不动值。

TX与PX的测算方式,假定剪裁地区为oTailor,照片地区oPicture:

TX = oTailor.offsetWidth + oTailor.offsetLeft;
PX = oPicture.offsetWidth + oPicture.offsetLeft;
拷贝编码

同理,能够依照上述方式对左边越界,上侧越界,下侧越界开展限定,就很少赘述。

挪动越界指的是早已产生了剪裁地区了,但根据电脑鼠标挪动剪裁地区时造成了越界。这个了解较为简易,就不画图详细介绍了。这类越界与dom拖拽越界线制1致,根据分辨电脑鼠标挪动间距是不是超出了照片地区来分辨。

基本原理与难题处理了,如今刚开始来进行具体作用。

在做以前,先做1些提前准备工作中,磨刀不误砍柴功。

网页页面合理布局提前准备

网页页面合理布局一部分重要编码以下:

 img src="./images/img_2.jpg" alt="" 
 div 
 div /div 
 div /div 
 div /div 
 div /div 
 div id="box_1" /div 
 div id="box_2" /div 
 div id="box_3" /div 
 div id="box_4" /div 
 div id="box_5" /div 
 div id="box_6" /div 
 div id="box_7" /div 
 div id="box_8" /div 
 /div 
 !-- 左 -- 
 div /div 
 !-- 上 -- 
 div /div 
 !-- 右 -- 
 div /div 
 !-- 下 -- 
 div /div 
 button 明确 /button 
拷贝编码

在其中img_box表明的是剪裁地区,outer表明黑影地区,而img_box中的div是剪裁地区的边框

款式操纵以下:

* {
 padding:0;
 margin:0;
body {
 background: #454545; 
.main {
 width: 500px;
 margin:50px auto;
.main img {
 width: 500px;
 position: absolute;
 left: 450px;
 top: 50px;
.img_box { 
 overflow: hidden;
 position: absolute;
 top:0px;
 left: 0px;
 z-index: 2;
.outer {
 overflow: hidden;
 background: #000;
 opacity: 0.4;
 position: absolute;
 top:0px;
 left: 0px;
 z-index: 0;
.box_border1 ,
.box_border2 ,
.box_border3 ,
.box_border4 {
 opacity: 0.5;
.box_border1 {
 background: url(./images/border-anim-v.gif) repeat-y left top;
.box_border2 {
 background: url(./images/border-anim-h.gif) repeat-x left top;
.box_border3 {
 background: url(./images/border-anim-v.gif) repeat-y right top;
.box_border4 {
 background: url(./images/border-anim-h.gif) repeat-x right bottom;
.box_handle { 
 background: #fff;
 border: 1px solid #000;
 opacity: 0.5;
.confrim {
 width: 80px;
 height: 35px;
拷贝编码

合理布局实际效果以下:

进行照片剪裁,根据上述基本原理,能够了解必须很多获得标识目标和标识的css特性等,因此能够撰写通用性涵数,更好的获得这些值。以下:

Dom获得涵数

这个涵数之前写的文章内容中有提过,但是那篇文章内容中出示的涵数有bug,如今重新写过1下:

/* 仿JqueryDom获得 */
function $(dom) {
 function getDom(dom) {
 var str = dom.charAt(0); 
 switch( str ) {
 case '.' :
 this.ele = document.getElementsByClassName(dom.substring(1))||null; 
 break;
 case '#' :
 this.ele = document.getElementById(dom.substring(1)) || null;
 break;
 default : 
 if(document.getElementsByTagName(dom).length) {
 this.ele = document.getElementsByTagName(dom); 
 } else if(document.getElementsByName(dom).length) {
 this.ele = document.getElementsByName(dom); 
 } else { 
 this.ele = null;
 return this; 

Css特性获得涵数

Css特性的获得分为两种,1种是IE的,应用currentStyle;另外一种是别的流行访问器,应用getComputedStyle,下列是适配版本号:

/* Css获得 */
function getCss(o , key){
 return o.currentStyle? o.currentStyle[key] : document.defaultView.getComputedStyle(o,false)[key]; 
拷贝编码

撰写时常常遇到对Dom的款式开展取值,为便捷,我专业撰写了1个涵数用于取值:

/**
- 取值涵数 
- @param : obj 被取值目标
- @param : option 开展的实际操作
- @parma : value 取值內容
function setAssign(obj , option , value) { 
 switch(option) {
 case 'width':
 obj.style.width = value;
 break;
 case 'height':
 obj.style.height = value;
 break;
 case 'top':
 obj.style.top = value;
 break;
 case 'left':
 obj.style.left = value;
 break;
 case 'position':
 obj.style.position = value;
 break;
 case 'cursor':
 obj.style.cursor = value;
拷贝编码

好了提前准备工作中基础进行,如今就宣布刚开始撰写。

根据点一下与挪动恶性事件进行剪裁地区绘图

对照片设定mousedown和mousemove恶性事件监控,以下:

// 电脑鼠标点一下照片开启
oPicture.onmousedown = function(ev) {
 // 恶性事件目标
 var oEvent = ev || window.event;
 // 原始电脑鼠标部位
 var tempX = oEvent.clientX;
 var tempY = oEvent.clientY; 
 // 调剂剪裁地区部位
 oTailor.style.left = oEvent.clientX + 'px';
 oTailor.style.top = oEvent.clientY + 'px';
 // 电脑鼠标在照片上挪动 绘图剪裁地区 黑影地区
 document.onmousemove = function(ev) {
 // 电脑鼠标挪动恶性事件目标
 var oEvent = ev || window.event;
 // 当今电脑鼠标部位减去电脑鼠标以前的电脑鼠标部位 等于 电脑鼠标挪动间距
 var sLeft = oEvent.clientX - tempX;
 var sTop = oEvent.clientY - tempY;
 // 剪裁越界线制 只需限定右边 与 下侧
 if((oTailor.offsetLeft+oTailor.offsetWidth) = (oPicture.offsetLeft+oPicture.offsetWidth)) {
 sLeft = oPicture.offsetLeft+oPicture.offsetWidth - oTailor.offsetLeft;
 if((oTailor.offsetTop+oTailor.offsetHeight) = (oPicture.offsetTop+oPicture.offsetHeight)) {
 sTop = oPicture.offsetTop+oPicture.offsetHeight - oTailor.offsetTop;
 // 剪裁地区绘图
 oTailor.style.width = sLeft + 'px';
 oTailor.style.height = sTop + 'px';
 // 剪裁地区显示信息
 oTailor.style.display = 'block';
 // 黑影地区显示信息
 for (var i = 0; i oShadow.length; i++) {
 oShadow[i].style.display = 'block';
 // 黑影地区绘图
 shadow(oPicture , oTailor , oShadow);
 // 加上剪裁边框
 tailorBorder(oDiv , oHandle , oTailor);
 // 阻拦默认设置恶性事件
 oEvent.preventDefault();
 // 电脑鼠标松开 将挪动恶性事件撤销
 document.onmouseup = function(ev) {
 var oEvent = ev || window.event;
 // 挪动恶性事件撤销
 document.onmousemove = null;
 // 阻拦默认设置恶性事件
 oEvent.preventDefault();
 // 阻拦默认设置恶性事件
 oEvent.preventDefault();
拷贝编码
黑影地区绘图
/** 
 * @param:oPicture 照片dom目标
 * @param:oTailor 剪裁地区dom目标
 * @param:oShadow 黑影地区dom目标
function shadow(oPicture , oTailor , oShadow) { 
 // 左边黑影区
 setAssign(oShadow[0] , 'width' , (parseInt(getCss(oTailor , 'left')) - parseInt(getCss(oPicture , 'left'))) + 'px');
 setAssign(oShadow[0] , 'height' , parseInt(getCss(oPicture , 'height')) + 'px');
 setAssign(oShadow[0] , 'left' , parseInt(getCss(oPicture , 'left')) + 'px')
 setAssign(oShadow[0] , 'top' , parseInt(getCss(oPicture , 'top')) + 'px')
 //右边黑影区
 setAssign(oShadow[2] , 'width' , (parseInt(getCss(oPicture , 'width')) - parseInt(getCss(oTailor ,'width')) - parseInt(getCss(oShadow[0] , 'width'))) + 'px');
 setAssign(oShadow[2] , 'height' , parseInt(getCss(oPicture , 'height')) + 'px');
 setAssign(oShadow[2] , 'left' , (parseInt(getCss(oTailor , 'left')) + parseInt(getCss(oTailor , 'width'))) + 'px');
 setAssign(oShadow[2] , 'top' , parseInt(getCss(oPicture , 'top')) + 'px');
 // 上侧黑影区
 setAssign(oShadow[1] , 'width' , parseInt(getCss(oTailor , 'width')) + 'px');
 setAssign(oShadow[1] , 'height' , (parseInt(getCss(oTailor , 'top')) - parseInt(getCss(oPicture , 'top'))) + 'px');
 setAssign(oShadow[1] , 'left' , (parseInt(getCss(oPicture , 'left')) + parseInt(getCss(oShadow[0] , 'width'))) + 'px');
 setAssign(oShadow[1] , 'top' , parseInt(getCss(oPicture , 'top')) + 'px');
 // 下侧黑影区
 setAssign(oShadow[3] , 'width' , parseInt(getCss(oTailor , 'width')) + 'px');
 setAssign(oShadow[3] , 'height' , (parseInt(getCss(oPicture , 'height')) - parseInt(getCss(oTailor , 'height')) - parseInt(getCss(oShadow[1] , 'height'))) + 'px');
 setAssign(oShadow[3] , 'left' , (parseInt(getCss(oPicture , 'left' )) + parseInt(getCss(oShadow[0] , 'width'))) + 'px');
 setAssign(oShadow[3] , 'top' , (parseInt(getCss(oTailor , 'top' )) + parseInt(getCss(oTailor , 'height'))) + 'px');
拷贝编码

}

留意在网页页面具体应用中,假如合理布局中照片css中沒有left或top特性,那末上面编码会造成不正确。应当应用offsetLeft与offsetTop替代之。

加上剪裁边框

在放出的合理布局图中,能够看见剪裁的边缘,4角及4边都有1个小正方形的样子,加上不但是以便区别剪裁区与非剪裁区,还为下1步加上拉伸剪裁地区出示便捷。下面刚开始撰写编码:

/**
 * 剪裁边框绘图
 * @param : oDIv 全部边框目标
 * @param : oHandle 点状边缘
 * @param : oTailor 剪裁目标
function tailorBorder(oDiv , oHandle , oTailor) {
 // 对边框开展原始化
 for (var i = 0; i oDiv.length; i++) {
 setAssign(oDiv[i] , 'position' , 'absolute');
 setAssign(oDiv[i] , 'top' , '0px');
 setAssign(oDiv[i] , 'left' , '0px');
 setAssign(oDiv[i] , 'width' , parseInt(getCss(oTailor , 'width')) + 'px');
 setAssign(oDiv[i] , 'height' , parseInt(getCss(oTailor , 'height')) + 'px');
 /* 点状边缘绘图 */ 
 // 4角点状边缘绘图
 for (var i = 0; i i++) { 
 // 点状绘图
 setAssign(oHandle[i] , 'position' , 'absolute');
 setAssign(oHandle[i] , 'width' , '5px');
 setAssign(oHandle[i] , 'height' , '5px');
 // 0 2 表明左边点状
 if(i % 2 == 0) {
 setAssign(oHandle[i] , 'left' , '0px');
 setAssign(oHandle[i] , 'top' , (i == 0?'0px' : (parseInt(getCss(oTailor , 'height')) - 8) + 'px')); 
 } else {
 // 右边点状
 setAssign(oHandle[i] , 'left' , ( parseInt(getCss(oTailor , 'width')) - 6 ) + 'px');
 setAssign(oHandle[i] , 'top' , (i == 1?'0px' : parseInt(getCss(oTailor , 'height')) - 8 ) + 'px'); 
 // 4边点状边框
 for (var i = 4; i oHandle.length; i++) {
 setAssign(oHandle[i] , 'position' , 'absolute');
 setAssign(oHandle[i] , 'width' , '5px');
 setAssign(oHandle[i] , 'height' , '5px');
 // 4 6 表明上 下 点状边框
 if(i % 2 == 0) {
 setAssign(oHandle[i] , 'left' , parseInt(getCss(oTailor , 'width')) / 2 + 'px');
 setAssign(oHandle[i] , 'top' , (i == 4 ? '0px' : (parseInt(getCss(oTailor , 'height')) - 8) + 'px'));
 } else {
 // 上下点状
 setAssign(oHandle[i] , 'top' , parseInt(getCss(oTailor , 'height')) / 2 + 'px');
 setAssign(oHandle[i] , 'left' ,(i == 5 ? '0px' : parseInt(getCss(oTailor , 'width')) - 8 ) + 'px');
拷贝编码

合理布局中,剪裁地区类名为box_handle的div前4个意味着4角的点状,后4个表明边缘正中间的点状,都依照顺时针遍布。进行后实际效果以下:

监控黑影地区

剪裁地区与黑影地区绘图进行,如今加上1个小作用,当电脑鼠标点一下到非剪裁区时(即黑影区),撤销剪裁地区。

// 对黑影地区设定時间 点一下到黑影区时 剪裁地区消退 黑影区消退
for (var i = 0; i oShadow.length; i++) {
 oShadow[i].index = i;
 oShadow[i].onmousedown = function() {
 oTailor.style.display = 'none';
 oTailor.style.width = '0px';
 oTailor.style.hegiht = '0px';
 for (var i = 0; i oShadow.length; i++) {
 oShadow[i].style.display = 'none';
 oShadow[i].style.left = '0px';
 oShadow[i].style.top = '0px';
拷贝编码
监控电脑鼠标挪动部位

接下来加上剪裁地区拉伸的作用,当电脑鼠标挪动到边缘的点状边框时展现不一样的实际效果

加上电脑鼠标显示信息实际效果
// 点状边框监控 设定相应实际操作
oTailor.onmousemove = function(ev) {
 var oTarget = oEvent.target; 
 switch(oTarget.id) {
 case 'box_1': // 左上
 setAssign(oTailor , 'cursor' , 'nw-resize'); 
 break;
 case 'box_2': // 右上 
 setAssign(oTailor , 'cursor' , 'ne-resize'); 
 break;
 case 'box_3': // 左下
 setAssign(oTailor , 'cursor' , 'sw-resize');
 break;
 case 'box_4': // 右下
 setAssign(oTailor , 'cursor' , 'se-resize');
 break;
 case 'box_5': // 上 
 setAssign(oTailor , 'cursor' , 'n-resize');
 break;
 case 'box_6': // 左
 setAssign(oTailor , 'cursor' , 'w-resize');
 break;
 case 'box_7': // 下 
 setAssign(oTailor , 'cursor' , 's-resize');
 break;
 case 'box_8': // 右 
 setAssign(oTailor , 'cursor' , 'e-resize');
 break;
 default : // 剪裁地区 显示信息可挪动提醒
 setAssign(oTailor , 'cursor' , 'move');
 break;
拷贝编码

因为监控的div较多,因而选用恶性事件授权委托的方法加上,实际效果不便捷演试,有兴趣爱好的同学能够自身检测,

加上拉伸实际效果
// 剪裁地区的挪动恶性事件
oTailor.onmousedown = function(ev) {
 // event恶性事件目标
 var oEvent = ev || window.event;
 // 获得cursor情况
 var oCur = getCss(oTailor , 'cursor'); 
 // 电脑鼠标原始部位
 var sTmpX = oEvent.clientX;
 var sTmpY = oEvent.clientY;
 // 获得剪裁地区的特性 用1个目标储存起来便捷启用
 oAttrs.left = getCss(oTailor , 'left');
 oAttrs.top = getCss(oTailor , 'top');
 oAttrs.width = getCss(oTailor , 'width');
 oAttrs.height = getCss(oTailor , 'height'); 
 document.onmousemove = function(ev) {
 // 挪动恶性事件目标
 var oEvent = ev || window.event;
 // 当今电脑鼠标部位减去原始电脑鼠标部位 等于 电脑鼠标挪动间距
 var sLeftT = oEvent.clientX - sTmpX;
 var sTopT = oEvent.clientY - sTmpY ;
 // 表明电脑鼠标挪动的间距
 var oTmpHeight = '';
 var oTmpTop = '';
 var oTmpWidth = '';
 var oTmpLeft = '';
 switch(oCur) {
 case 'nw-resize' : // 左上
 oTmpWidth = parseInt(oAttrs.width) - sLeftT ; 
 oTmpHeight = parseInt(oAttrs.height) - sTopT ; 
 oTmpLeft = parseInt(oAttrs.left) + sLeftT ; 
 oTmpTop = parseInt(oAttrs.top) + sTopT ; 
 break;
 case 'ne-resize' : // 右上
 // 此时width不可以减去电脑鼠标挪动间距 由于此时挪动间距为恰逢
 oTmpWidth = parseInt(oAttrs.width) + sLeftT ; 
 oTmpHeight = parseInt(oAttrs.height) - sTopT ; 
 // 右上角挪动不必须left值 由于默认设置响右挪动
 oTmpTop = parseInt(oAttrs.top) + sTopT ; 
 break;
 case 'sw-resize' : // 左下
 // 同右上 height 务必是再加电脑鼠标挪动间距
 oTmpWidth = parseInt(oAttrs.width) - sLeftT ; 
 oTmpHeight = parseInt(oAttrs.height) + sTopT ; 
 oTmpLeft = parseInt(oAttrs.left) + sLeftT ; 
 break;
 case 'se-resize' : // 右下
 // 左下与右上的融合 另外除去left与top
 oTmpWidth = parseInt(oAttrs.width) + sLeftT ; 
 oTmpHeight = parseInt(oAttrs.height) + sTopT ; 
 break;
 case 'n-resize' : // 上
 oTmpHeight = parseInt(oAttrs.height) - sTopT;
 oTmpTop = parseInt(oAttrs.top) + sTopT; 
 break;
 case 'w-resize' : // 左
 oTmpWidth = parseInt(oAttrs.width) - sLeftT ;
 oTmpLeft = parseInt(oAttrs.left) + sLeftT; 
 break;
 case 's-resize' : // 下
 oTmpHeight = parseInt(oAttrs.height) + sTopT;
 break;
 case 'e-resize' : // 右
 var oTmpWidth = parseInt(oAttrs.width) + sLeftT;
 break;
 default : 
 // 不然是挪动剪裁地区
 tailorMove(oEvent , oTailor , oPicture , oShadow);
 break;

if(parseInt(getCss(oTailor , 'top')) = oPicture.offsetTop) { oTmpHeight = parseInt(getCss(oPicture,'height')) - (oPicture.offsetTop+parseInt(getCss(oPicture,'height'))-parseInt(getCss(oTailor,'top'))-parseInt(getCss(oTailor,'height'))); oTmpTop = oPicture.offsetTop; }else if(oPicture.offsetTop+parseInt(getCss(oPicture,'height')) = (parseInt(getCss(oTailor,'top'))+parseInt(getCss(oTailor,'height')))){ // 向往下拉到界限 oTmpHeight = oPicture.offsetTop+parseInt(getCss(oPicture,'height')) - parseInt(getCss(oTailor,'top')); // 向左拉到界限 if((parseInt(getCss(oTailor , 'left'))) = oPicture.offsetLeft) { oTmpWidth = parseInt(getCss(oPicture,'width')) - (oPicture.offsetLeft+parseInt(getCss(oPicture),'width')-parseInt(getCss(oTailor,'left'))-parseInt(getCss(oTailor,'width'))) oTmpLeft = oPicture.offsetLeft; } else if(parseInt(getCss(oTailor , 'width')) + parseInt(getCss(oTailor,'left')) = (oPicture.offsetLeft+oPicture.offsetWidth)) { // 向右拉到界限 oTmpWidth = oPicture.offsetLeft+oPicture.offsetWidth - parseInt(getCss(oTailor,'left')); // 取值 if(oTmpWidth){ setAssign(oTailor , 'width' , oTmpWidth + 'px'); if(oTmpHeight) { setAssign(oTailor , 'height' , oTmpHeight + 'px'); if (oTmpLeft) { setAssign(oTailor , 'left' , oTmpLeft + 'px'); if (oTmpTop) { setAssign(oTailor , 'top' , oTmpTop + 'px'); // 黑影地区绘图 shadow(oPicture , oTailor , oShadow); // 加上剪裁边框 tailorBorder(oDiv , oHandle , oTailor); // 当松开电脑鼠标时留意撤销挪动恶性事件 document.onmouseup = function(ev) { // event恶性事件目标 var oEvent = ev || window.event; document.onmousemove = null; oEvent.preventDefault(); oEvent.preventDefault(); 拷贝编码

拉伸时留意挪动间距的测算,非常是向上及向左挪动时,要留意另外更改剪裁地区的left、top值,不然它只会向下、向右增大。来实际说1下怎样测算:

以电脑鼠标向左上角拉伸为例,电脑鼠标的挪动间距与上面所讲的1致,但此时留意测算出的值是1个负数,因此在测算剪裁地区的提升值时,要用原剪裁区的宽度或高宽比减去该值,另外,提升是多少宽度,剪裁区的左偏位值就要减去是多少,不然显示信息的实际效果是剪裁地区向右增大,以下图:

上图中,翠绿色地区是拉伸时提升宽、高后的剪裁地区,假如没开展偏位调剂后的实际效果既是这样,黄色地区是开展偏位自动跳转后的剪裁地区,两个的叠加区便是原先的剪裁区了。

这是左上角拉伸,左下角拉伸即别的与之相近,可按照向上套。

而另外一重要,拉伸越界在上面早已说过,就已不描述了。

剪裁地区的挪动

如今来讲最终1个作用,剪裁地区的挪动。当电脑鼠标挪动到剪裁地区內部时,就会开启挪动恶性事件,此时能够挪动剪裁地区,编码以下:

/* 剪裁地区的挪动 */
function tailorMove(ev ,oTailor , oPicture ,oShadow) {
 var oEvent = ev || window.event;
 var oTmpx = oEvent.clientX - oTailor.offsetLeft;
 var oTmpy = oEvent.clientY - oTailor.offsetTop; 
 document.onmousemove = function(ev) {
 var oEvent = ev || window.event; 
 oLeft = oEvent.clientX - oTmpx;
 oTop = oEvent.clientY - oTmpy; 

oLeft = oPicture.offsetLeft ; } else if(oLeft (oPicture.offsetLeft + oPicture.offsetWidth - oTailor.offsetWidth)) { oLeft = oPicture.offsetLeft + oPicture.offsetWidth - oTailor.offsetWidth; if(oTop oPicture.offsetTop) { oTop = oPicture.offsetTop; } else if (oTop (oPicture.offsetTop + oPicture.offsetHeight - oTailor.offsetHeight)) { oTop = oPicture.offsetTop + oPicture.offsetHeight - oTailor.offsetHeight; oTailor.style.left = ( oLeft)+ 'px'; oTailor.style.top = (oTop) + 'px'; shadow(oPicture , oTailor , oShadow); 拷贝编码
获得剪裁的部位

剪裁实际效果的作用基础进行,那末就要获得剪裁的部位,最先要了解必须获得那些特性。依据PHP的GD库实际操作,开展照片剪裁必须了解,剪裁的起始点座标和剪裁的宽高。我用1个涵数来获得这些数据信息,并将其封裝后回到:

function getEle() {
 var oPicture = $('img').get(0);
 var oTailor = $('.img_box').get(0);
 oAttrs.LeftX = (parseInt(getCss(oTailor,'left')) - oPicture.offsetLeft);
 oAttrs.LeftY = (parseInt(getCss(oTailor,'top')) - oPicture.offsetTop);
 oAttrs.Twidth = (parseInt(getCss(oTailor,'width')));
 oAttrs.Theight = (parseInt(getCss(oTailor,'height')));
 return oAttrs;
拷贝编码

也有1个难题,假如网页页面上的照片是应用css缩小后的照片,那末在此得到的部位与剪裁尺寸会与你想象的有差别,将会剪裁后的照片范畴会增大(原图较大),也是有将会会缩小(原图较小)。

假如可以得到原图的尺寸,能够依据缩小图与原图的占比来开展剪裁,这样能够得到正确的剪裁图。

好了,1个简易的照片剪裁作用就进行了,能够运用ajax传送到后台管理开展解决了。

時间匆忙,在写这篇系统日志的情况下,也发现了很多bug,如,对剪裁越界的解决,当剪裁到将要越界地区,也便是剪裁地区到了照片的界限时,不但越界的1边没法拉伸,非越界的1边也不可以拉伸。之后有時间才开展改动吧。

我外行前端开发,且该作用彻底由自身单独进行,因此js撰写时,将会不太技术专业,还请见谅。

(需fanqiang)

转载于:https://juejin.im/post/5a30f2da5a4b4

收起 进行全文
根据MVC的单主通道基本原理就不...开启新增商品url——http://localhost/webbuildceo_lb/admin/product.php?product_type=1&cPath=0_1_3&action=new_product&x=51&y=8 点一下新增产品按钮url——http://localhost/webbuild
这里也是有许多資源: http://www.baiduyun.me/forum⑺6⑴.html 应用百度搜索帐号登陆不用邀约码 解压登陆密码为看雪论坛主页 “bbs.pediy.com” 有关播发登陆密码以下: 如一些课程中的某几个课程必须播发...
#bookmarks02.html  It will be read and overwritten.  DO NOT EDIT! -- Bookmarks 书签菜单  从 Internet Explorer ... 5种开源系统协议书的较为(BSD、Apache、GPL、LGPL、MIT) - 开源系统我国
★论坛视頻篇(此一部分用于搜集公布2014各大网的VIP收费视頻实例教程,每一年为1周期,不确定期修补无效或升级,大伙儿如若发现无效或有資源共享能够发电子邮件或本帖回应我!)272、老男孩Linux.shell.RHCE运维管理中学高級50G全套...
【原文详细地址】-【資源合集】测算机程序编写书本.PDF共享 UNIX程序编写造型艺术 连接:https://pan.baidu.com/share/link?uk=975929401 shareid=3356352294 adapt=pc fr=ftw Effective Java 汉语版(第2版) ...