ホームページ > バックエンド開発 > PHPチュートリアル > PHPのトリミングに関連する問題があり、1日かけて取り組んでいます。

PHPのトリミングに関連する問題があり、1日かけて取り組んでいます。

WBOY
リリース: 2016-06-13 12:21:12
オリジナル
934 人が閲覧しました

PHP のトリミングの問題です。アドバイスをお願いします。一日中取り組んでいます。
フロントエンドで JCROP を使用して x、y 座標、幅、高さを取得し、それらを uphoto に渡します。 .php を処理するようになりました。これですべてが正常になりますが、フロントエンド ユーザーが選択した画像の幅が大きすぎる場合 (CSS スタイルを使用して、ユーザーが選択した画像の最大幅を 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 ."' />";<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 />
ログイン後にコピー

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート