首頁 >後端開發 >php教程 >PHP 裁切有关问题,求大神指点指点,弄了一天了.

PHP 裁切有关问题,求大神指点指点,弄了一天了.

WBOY
WBOY原創
2016-06-13 12:21:12936瀏覽

PHP 裁切问题,求大神指点指点,弄了一天了...
我前端用JCROP获取到x、y坐标、宽度、高度,传递到 uphoto.php处理,现在一切正常,但是如果前端用户选择的图片宽度过大(我用css样式控制用户选择的图片最大宽度为680px),裁切出来的就不正常了...我查阅了一些资料,说是需要按比例换算,但是是按什么比例换算啊,用户选择的图片的宽度(大于680px时)和680换算么?

这是 uphoto.php:

<br /><br /><br />$x1 = $_POST["x1"];<br />$x2 = $_POST["x2"];<br />$y1 = $_POST["y1"];<br />$y2 = $_POST["y2"];<br />$targ_w = $_POST["w"];<br />$targ_h = $_POST["h"];<br /><br /><br />if ($_FILES["mfile"]["error"]){echo "error: " . $_FILES["file"]["error"];}<br />if (!empty($_FILES["mfile"]["name"])){ //提取文件域内容名称,并判断<br />$path = "/upload/user/photo/"; //上传路径<br />//检查是否有该文件夹,如果没有就创建,并给予最高权限<br />//if(!file_exists($path)){mkdir("$path", 0700);}<br />//允许上传的文件格式<br />$allow_type = array("image/gif","image/pjpeg","image/jpeg","image/png");<br />//检查上传文件是否在允许上传的类型<br />if(!in_array($_FILES["mfile"]["type"], $allow_type)){echo "error:格式有误,仅支持gif/jpg/png"; exit();}<br />//检测图片大小<br />if($_FILES["mfile"]["size"] > 5*1024*1024){echo "error:文件不得超过5M"; exit();}<br />$filetype = $_FILES["mfile"]["type"];<br />if($filetype == "image/jpeg"){<br />$img_type = ".jpg";<br />}<br />if ($filetype == "image/jpg") {<br />$img_type = ".jpg";<br />}<br />if ($filetype == "image/pjpeg") {<br />$img_type = ".jpg";<br />}<br />if($filetype == "image/gif"){<br />$img_type = ".gif";<br />}<br />if($filetype == "image/png"){<br />$img_type = ".png";<br />}<br />if($_FILES["mfile"]["name"])<br />{<br />$randstr = random_str().date("YmdHis"); //获取时间并赋值给变量<br />$saveto = $_SERVER['DOCUMENT_ROOT'].$path.$randstr.$img_type; //图片的完整路径<br />$newimg = $randstr.$img_type; //图片名称<br />$flag=1;<br />}<br />//END IF<br />if ($flag){$result = move_uploaded_file($_FILES["mfile"]["tmp_name"], $saveto);}<br />//特别注意这里传递给move_uploaded_file的第一个参数为上传到服务器上的临时文件<br />$src_file = $saveto;<br />}}<br /><br /><br />$type = exif_imagetype($src_file);<br /><br />$support_type = array(IMAGETYPE_JPEG , IMAGETYPE_PNG , IMAGETYPE_GIF);<br />if(!in_array($type, $support_type, true)){echo "error:当前图片格式非JPG/PNG/GIF";exit();}<br />//Load image<br />switch($type) {<br />case IMAGETYPE_JPEG :<br />$src_img = imagecreatefromjpeg($src_file);<br />break;<br />case IMAGETYPE_PNG :<br />$src_img = imagecreatefrompng($src_file);<br />break;<br />case IMAGETYPE_GIF :<br />$src_img = imagecreatefromgif($src_file);<br />break;<br />default:<br />echo "Load image error!";<br />exit();<br />}<br /><br />$dst_r = ImageCreateTrueColor($targ_w, $targ_h);<br />list($width_orig, $height_orig) = getimagesize($src_file);<br />//if ($width_orig > 680){<br />//$new_width_orig = 680;<br />//$new_height_orig = ($height_orig*680)/$width_orig;<br />//}<br />//else {<br />//$new_width_orig = $targ_w;<br />//$new_height_orig = $targ_h;<br />//}<br /><br />//echo $new_width_orig."<br />";<br />//echo $new_height_orig."<br />";<br />//echo "x:".$x1."<br />";<br />//echo "y:".$y1;<br />//exit();<br /><br />imagecopyresampled($dst_r, $src_img, 0, 0, $x1, $y1, $targ_w, $targ_h, $targ_w, $targ_h);<br />//imagecopyresampled($dst_r, $src_img, 0, 0, $x1, $y1, $targ_w, $targ_h, $targ_w, $targ_h);<br /><br />switch($type) {<br />case IMAGETYPE_JPEG :<br />header('Content-type: image/jpeg');<br />imagejpeg($dst_r, null, 100);<br />break;<br />case IMAGETYPE_PNG :<br />header('Content-type: image/png');<br />imagepng($dst_r, null, 100);<br />break;<br />case IMAGETYPE_GIF :<br />header('Content-type: image/gif');<br />imagegif($dst_r, null, 100);<br />break;<br />default:<br />break;<br />}<br />echo "<img  src='". $dst_r ."' / alt="PHP 裁切有关问题,求大神指点指点,弄了一天了." >";<br />exit;<br /><br /><br />


求大神指点指点
------解决思路----------------------
用css样式控制用户选择的图片最大宽度为680px
就表示用户看到的是经过动态缩放的副本
那么你在传递裁剪区域坐标的时候,还需传递图片的原始尺寸
换算一下就可以了
X= x/680*图片宽


------解决思路----------------------
可以参考一下我之前写的裁剪。因为你是要裁剪,所以宽和高有一个是和裁剪后的尺寸的宽和高一样,另一边会>=裁剪后的。
http://blog.csdn.net/fdipzone/article/details/9316385

<br />    /** 获取目标图生成的size <br />    * @return Array $width, $height <br />    */  <br />    private function get_size(){  <br />        list($owidth, $oheight) = getimagesize($this->_source);  <br />        $width = (int)($this->_width);  <br />        $height = (int)($this->_height);  <br />          <br />        switch($this->_type){  <br />            case 'fit':  <br />                $pic_w = $width;  <br />                $pic_h = (int)($pic_w*$oheight/$owidth);  <br />                if($pic_h>$height){  <br />                    $pic_h = $height;  <br />                    $pic_w = (int)($pic_h*$owidth/$oheight);  <br />                }  <br />                break;  <br />            case 'crop':  <br />                $pic_w = $width;  <br />                $pic_h = (int)($pic_w*$oheight/$owidth);  <br />                if($pic_h<$height){  <br />                    $pic_h = $height;  <br />                    $pic_w = (int)($pic_h*$owidth/$oheight);  <br />                }  <br />                break;  <br />        }  <br />  <br />        return array($pic_w, $pic_h);  <br />    } <br />

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn